逻辑运算符和条件运算符的问题

本文关键字:问题 条件运算符 逻辑运算符 | 更新日期: 2023-09-27 18:36:25

我无法使用逻辑/条件运算符找出正确的实现。我对应用程序有一个非常具体的要求,起初我认为它工作正常,但是当放置在市场上时,我发现我的实现根本不起作用。

  1. 如果我的应用程序处于试用模式,并且保存的发生次数> 100,则需要执行操作。
  2. 如果应用程序处于试用模式并且保存的发生次数为 <= 100,或者应用程序处于完整模式,那么我需要执行另一个操作。

我所拥有的按钮单击事件如下

//recorded count of number of saved button presses
Settings.SavedCount.Value += 1;
        //both conditions must be true for the code to execute inside the 'if'
        if (TrialViewModel.LicenseModeString ==  "Trial" && Settings.SavedCount.Value > 100)
        {
            MessageBoxResult result = MessageBox.Show("You have saved over 100 items! Would you like to continue?", "Congratulations", MessageBoxButton.OKCancel);
            switch (result)
            {
                case MessageBoxResult.OK:
                    // A command takes a parameter and in this case we can pass null.
                    TrialViewModel.BuyCommand.Execute(null);
                    break;
                case MessageBoxResult.Cancel:
                    return;
                    break;
            }
        }
        //either the entire first condition OR the second condition must be true to execute the method ApplyAndSaveAsync()
        else if((TrialViewModel.LicenseModeString == "Trial" && Settings.SavedCount.Value <= 100) || TrialViewModel.LicenseModeString == "Full")
        {
            ApplyAndSaveAsync();
        }

调试时一切似乎都运行良好,尽管当我在试用和完整模式下从市场上下载应用程序后对其进行测试时,这两种情况下都没有执行ApplyAndSaveAsync()。请注意,计数将始终无限增加,但应用程序可能处于试用模式,也可能不处于试用模式。仅当它作为试用版下载并在用户更新它之前,它才处于试用模式,在这种情况下,它的许可证将自动更改为完整模式。

编辑**

可能使用序数字符串比较而不是 http://msdn.microsoft.com/en-us/library/vstudio/cc165449(v=vs.110)中所述的"==".aspx。

string _license = TrialViewModel.LicenseModeString;
string _isTrial = "Trial";
// Use the overload of the Equals method that specifies a StringComparison. 
// Ordinal is the fastest way to compare two strings.
bool result = _license.Equals(_isTrial, StringComparison.Ordinal);
Settings.SavedCount.Value += 1;
//both conditions must be true for the code to execute inside the 'if'
    if (result && Settings.SavedCount.Value > 100)
    {
        MessageBoxResult result = MessageBox.Show("You have saved over 100 items! Would you like to continue?", "Congratulations", MessageBoxButton.OKCancel);
        switch (result)
        {
            case MessageBoxResult.OK:
                // A command takes a parameter and in this case we can pass null.
                TrialViewModel.BuyCommand.Execute(null);
                break;
            case MessageBoxResult.Cancel:
                return;
                break;
        }
    }
    //either the entire first condition OR the second condition must be true to execute the method ApplyAndSaveAsync()
    else if((result && Settings.SavedCount.Value <= 100) || TrialViewModel.LicenseModeString == "Full")
    {
        ApplyAndSaveAsync();
    }

另外,使用逻辑和条件 AND 和 OR 函数有什么区别?我想确保ifif else语句中的两个语句都经过评估,以确保正确的程序。我的实现是否正确?

编辑 2** 为试用实现添加视图模型和类帮助程序

试用视图模型

#region fields
private RelayCommand buyCommand;
#endregion fields
#region constructors
public TrialViewModel()
{
    // Subscribe to the helper class's static LicenseChanged event so that we can re-query its LicenseMode property when it changes.
    TrialExperienceHelper.LicenseChanged += TrialExperienceHelper_LicenseChanged;
}
#endregion constructors
#region properties        
/// <summary>
/// You can bind the Command property of a Button to BuyCommand. When the Button is clicked, BuyCommand will be
/// invoked. The Button will be enabled as long as BuyCommand can execute.
/// </summary>
public RelayCommand BuyCommand
{
    get
    {
        if (this.buyCommand == null)
        {
            // The RelayCommand is constructed with two parameters - the action to perform on invocation,
            // and the condition under which the command can execute. It's important to call RaiseCanExecuteChanged
            // on a command whenever its can-execute condition might have changed. Here, we do that in the TrialExperienceHelper_LicenseChanged
            // event handler.
            this.buyCommand = new RelayCommand(
                param => TrialExperienceHelper.Buy(),
                param => TrialExperienceHelper.LicenseMode == TrialExperienceHelper.LicenseModes.Trial);
        }
        return this.buyCommand;
    }
}
public string LicenseModeString
{
    get
    {
        return TrialExperienceHelper.LicenseMode.ToString()/* + ' ' + AppResources.ModeString*/;
    }
}
#endregion properties
#region event handlers
// Handle TrialExperienceHelper's LicenseChanged event by raising property changed notifications on the
// properties and commands that 
internal void TrialExperienceHelper_LicenseChanged()
{
    this.RaisePropertyChanged("LicenseModeString");
    this.BuyCommand.RaiseCanExecuteChanged();
}
#endregion event handlers

试用体验助手.cs

#region enums
    /// <summary>
    /// The LicenseModes enumeration describes the mode of a license.
    /// </summary>
    public enum LicenseModes
    {
        Full,
        MissingOrRevoked,
        Trial
    }
    #endregion enums
    #region fields
#if DEBUG
    // Determines how a debug build behaves on launch. This field is set to LicenseModes.Full after simulating a purchase.
    // Calling the Buy method (or navigating away from the app and back) will simulate a purchase.
    internal static LicenseModes simulatedLicMode = LicenseModes.Trial;
#endif // DEBUG
    private static bool isActiveCache;
    private static bool isTrialCache;
    #endregion fields
    #region constructors
    // The static constructor effectively initializes the cache of the state of the license when the app is launched. It also attaches
    // a handler so that we can refresh the cache whenever the license has (potentially) changed.
    static TrialExperienceHelper()
    {
        TrialExperienceHelper.RefreshCache();
        PhoneApplicationService.Current.Activated += (object sender, ActivatedEventArgs e) => TrialExperienceHelper.
#if DEBUG
            // In debug configuration, when the user returns to the application we will simulate a purchase.
OnSimulatedPurchase();
#else // DEBUG
            // In release configuration, when the user returns to the application we will refresh the cache.
RefreshCache();
#endif // DEBUG
    }
    #endregion constructors
    #region properties
    /// <summary>
    /// The LicenseMode property combines the active and trial states of the license into a single
    /// enumerated value. In debug configuration, the simulated value is returned. In release configuration,
    /// if the license is active then it is either trial or full. If the license is not active then
    /// it is either missing or revoked.
    /// </summary>
    public static LicenseModes LicenseMode
    {
        get
        {
#if DEBUG
            return simulatedLicMode;
#else // DEBUG
            if (TrialExperienceHelper.isActiveCache)
            {
                return TrialExperienceHelper.isTrialCache ? LicenseModes.Trial : LicenseModes.Full;
            }
            else // License is inactive.
            {
                return LicenseModes.MissingOrRevoked;
            }
#endif // DEBUG
        }
    }
    /// <summary>
    /// The IsFull property provides a convenient way of checking whether the license is full or not.
    /// </summary>
    public static bool IsFull
    {
        get
        {
            return (TrialExperienceHelper.LicenseMode == LicenseModes.Full);
        }
    }
    #endregion properties
    #region methods
    /// <summary>
    /// The Buy method can be called when the license state is trial. the user is given the opportunity
    /// to buy the app after which, in all configurations, the Activated event is raised, which we handle.
    /// </summary>
    public static void Buy()
    {
        MarketplaceDetailTask marketplaceDetailTask = new MarketplaceDetailTask();
        marketplaceDetailTask.ContentType = MarketplaceContentType.Applications;
        marketplaceDetailTask.Show();
    }
    /// <summary>
    /// This method can be called at any time to refresh the values stored in the cache. We re-query the application object
    /// for the current state of the license and cache the fresh values. We also raise the LicenseChanged event.
    /// </summary>
    public static void RefreshCache()
    {
        TrialExperienceHelper.isActiveCache = CurrentApp.LicenseInformation.IsActive;
        TrialExperienceHelper.isTrialCache = CurrentApp.LicenseInformation.IsTrial;
        TrialExperienceHelper.RaiseLicenseChanged();
    }
    private static void RaiseLicenseChanged()
    {
        if (TrialExperienceHelper.LicenseChanged != null)
        {
            TrialExperienceHelper.LicenseChanged();
        }
    }
#if DEBUG
    private static void OnSimulatedPurchase()
    {
        TrialExperienceHelper.simulatedLicMode = LicenseModes.Full;
        TrialExperienceHelper.RaiseLicenseChanged();
    }
#endif // DEBUG
    #endregion methods
    #region events
    /// <summary>
    /// The static LicenseChanged event is raised whenever the value of the LicenseMode property has (potentially) changed.
    /// </summary>
    public static event LicenseChangedEventHandler LicenseChanged;
    #endregion events

逻辑运算符和条件运算符的问题

这可能是黑暗中的表演,但在某些情况下(有时在 Java 中,但我不确定 .NET)与"=="的字符串比较不起作用。您可以尝试使用"比较"方法而不是"=="。