如何在null检查语句中解决空引用异常?

时间:2015-11-27 00:26:02

标签: c# properties nullreferenceexception null-check

我已经在布尔方法中添加了一个null属性检查,以防止返回true,如果SelectedCustomer属性中的任何字符串字段为空。

问题是我在构造函数中调用bool方法,然后才将任何数据输入到SelectedCustomer模型中。然后,这会导致Null引用异常。

我可以从断点上看到我在语句中设置了" {"对象引用未设置为对象的实例。"}"是错误。在我从数据网格中选择客户之前,selectedCustomer属性尚未初始化。

我的问题是,如何在不造成NRE的情况下以这种方式执行空检查?

这是我执行空检查的CanModifyCustomer布尔方法:

private bool CanModifyCustomer(object obj)
{

    if (SelectedCustomer.FirstName != null && SelectedCustomer.LastName != null && SelectedCustomer != null)
    {
        return true;
    }

    return false;            
}

它在我的按钮命令中作为参数传递:

public MainViewModel(ICustomerDataService customerDataService) 
{
    this._customerDataService = customerDataService;
    QueryDataFromPersistence();

    UpdateCommand = new CustomCommand((c) => UpdateCustomerAsync(c).FireAndLogErrors(), CanModifyCustomer);

}

这是执行null检查的SelectedCustomer属性:

 private CustomerModel selectedCustomer;
    public CustomerModel SelectedCustomer
    {
        get
        {
            return selectedCustomer;
        }
        set
        {
            selectedCustomer = value;
            RaisePropertyChanged("SelectedCustomer");
        }
    }

1 个答案:

答案 0 :(得分:2)

只需使用null条件运算符。 (C#6)

if (SelectedCustomer?.FirstName != null && SelectedCustomer.LastName != null)
{
    return true;
}

或者你应该先放SelectedCustomer != null。因为条件是从左到右评估的。因此,如果第一个因为使用&&运算符而为假,则它将不会继续检查其他部分,并且条件变为false。

if (SelectedCustomer != null && SelectedCustomer.FirstName != null && SelectedCustomer.LastName != null)
{
    return true;
}