C# 正确零校验

C# 正确零校验,c#,oop,properties,null,C#,Oop,Properties,Null,我正在实例化一个关联对象,并从主窗体内的txtboxs为其分配属性。空检查的最佳实践是什么?是在赋值之前用if语句检查每个属性,还是有更好的方法?这是我的密码: Associate updateAssociate = new Associate(); updateAssociate.AssocID = txtAssocId.Text; updateAssociate.FirstName = txtFname.Text; updateAssociate.LastName = txtLname.T

我正在实例化一个关联对象,并从主窗体内的txtboxs为其分配属性。空检查的最佳实践是什么?是在赋值之前用if语句检查每个属性,还是有更好的方法?这是我的密码:

Associate updateAssociate = new Associate();

updateAssociate.AssocID = txtAssocId.Text;
updateAssociate.FirstName = txtFname.Text;
updateAssociate.LastName = txtLname.Text;
updateAssociate.HireDate = Convert.ToDateTime(txtHireDate.Text);
updateAssociate.ContractEndDate = Convert.ToDateTime(txtContractEnd.Text);
updateAssociate.TerminationDate = Convert.ToDateTime(txtTerminationDate.Text);
updateAssociate.FullPartTimeID = cboFullPart.SelectedText;
updateAssociate.PrimaryRole = cboPRole.SelectedText;
在C#6中是这样的

在以前的c#版本中,您可以编写一种方法来消除代码重复。大概是这样的:

public static T CheckNull<T>(Func<T> canBeNull) where T : class
    {
        try
        {
            return canBeNull();
        }
        catch (NullReferenceException)
        {
            return default(T);
        }
    }
然后,您可以将任何可能向lambda中抛出空引用的代码包装起来,将其传递给此方法,而不再为它操心。

在C#6中就是这样

在以前的c#版本中,您可以编写一种方法来消除代码重复。大概是这样的:

public static T CheckNull<T>(Func<T> canBeNull) where T : class
    {
        try
        {
            return canBeNull();
        }
        catch (NullReferenceException)
        {
            return default(T);
        }
    }

然后,您可以将任何可能向lambda中抛出空引用的代码包装起来,将其传递给此方法,而不再使用它。

根据您对问题的评论:

如果它是一个文本框,那么它将是.text属性,在将它们分配给对象之前,我希望检查null或空白值

在这样赋值时,可以使用null合并运算符检查null值:

updateAssociate.AssocID = txtAssocId.Text ?? string.Empty;
或:

这样,如果
txtAssocId.Text
null
,则将定义的默认值指定给对象属性,而不是
null

虽然我不能完全确定
TextBox
.Text
属性是否为
null
,而不是空字符串。也许你想检查一下这两种情况

updateAssociate.AssocID = string.IsNullOrEmpty(txtAssocId.Text) ? someDefaultValue : txtAssocId.Text;

根据您对问题的评论:

如果它是一个文本框,那么它将是.text属性,在将它们分配给对象之前,我希望检查null或空白值

在这样赋值时,可以使用null合并运算符检查null值:

updateAssociate.AssocID = txtAssocId.Text ?? string.Empty;
或:

这样,如果
txtAssocId.Text
null
,则将定义的默认值指定给对象属性,而不是
null

虽然我不能完全确定
TextBox
.Text
属性是否为
null
,而不是空字符串。也许你想检查一下这两种情况

updateAssociate.AssocID = string.IsNullOrEmpty(txtAssocId.Text) ? someDefaultValue : txtAssocId.Text;


你到底期望什么是空值?所有控件都将始终存在,除非代码位于错误的开始位置。(或者自己动态创建控件?)。其余部分应为
string.Empty
。很抱歉,要清除控件的内容。如果它是一个文本框,那么它就是.text属性。在我将空值或空值分配给对象之前,我想检查它们。@VinnyGuitara:还不清楚您试图解决的实际问题是什么。在发布的代码中似乎不存在很高的空引用概率,除非有其他错误。对于任何指定的属性,如果该值为null,您还想做什么?@David。。。。因此,如果我的表单是从数据库中填充的,然后我从我试图处理的文本字段中实例化一个Associate对象,如果从DB返回的这些字段中有一个是null,那么您希望null是什么呢?所有控件都将始终存在,除非代码位于错误的开始位置。(或者自己动态创建控件?)。其余部分应为
string.Empty
。很抱歉,要清除控件的内容。如果它是一个文本框,那么它就是.text属性。在我将空值或空值分配给对象之前,我想检查它们。@VinnyGuitara:还不清楚您试图解决的实际问题是什么。在发布的代码中似乎不存在很高的空引用概率,除非有其他错误。对于任何指定的属性,如果该值为null,您还想做什么?@David。。。。因此,如果我的表单是从数据库中填充的,然后我从我试图处理的文本字段中实例化一个Associate对象,如果从DB返回的其中一个字段为null,这看起来很有趣。如何在上面的代码中实现这一点?
returnitem==null?默认值(T):项目等于
退货项目T
为class@Dmitry大概此解决方案模拟空条件运算符。您不需要重写代码,只需将其包装到lambda中即可。这实际上应该有两种泛型类型。如果要模拟
?。
@jugarr,则输入(在
?。
之前的项目)和输出(在
?。
之后的项目)为什么需要在
之前的类型。
?它必须是引用类型,这才是最重要的。这看起来很有趣。如何在上面的代码中实现这一点?
returnitem==null?默认值(T):项目等于
退货项目T
为class@Dmitry大概此解决方案模拟空条件运算符。您不需要重写代码,只需将其包装到lambda中即可。这实际上应该有两种泛型类型。如果要模拟
?。
@jugarr,则输入(在
?。
之前的项目)和输出(在
?。
之后的项目)为什么需要在
之前的类型。
?它必须是引用类型,这才是最重要的。我想这就是答案,combobox值属性呢。如果组合框为空,则value属性将为null,对吗?如果是这样,我将如何处理?我有一个:updateAssociate.Location=(cboLocation.SelectedValue??string.Empty)@VinnyGuitara:对于任何给定的控件,尤其是