在转换和分配之前检查值是否为null

时间:2011-01-26 18:27:16

标签: c# .net-2.0

我正在使用c#.net 2.0,需要检查我分配对象的方法返回的值是否为null。

我的代码是

MyObjectValue myObjectValue= (MyObjectValue) myObjectField.GetFieldValue();

在这个实例中,myObjectField.GetFieldValue()返回的值可能为null,我想在分配给myObjectValue之前检查它。目前它抛出的异常对象引用未设置为对象的值。

实际的代码行使用的是SharePoint API

SPFieldUserValue lawyerResponsibleFieldValue = 
    (SPFieldUserValue)lawyerResponsibleUserField.GetFieldValue(
              workflowProperties.Item[lawyerResponsibleUserField.Id].ToString());

9 个答案:

答案 0 :(得分:4)

.的任何地方,它代表成员访问权,如果左侧是引用类型(类),则它可以为null。

此代码段有几个可能出现空值的地方:

workflowProperties.Item[lawyerResponsibleUserField.Id].ToString()
                  ^                               ^   ^

我首先要进入调试会话并查看存在的值,并阅读有关该问题的任何文档。然后我可能会重新考虑像这样编写代码。

if (lawyerResponsibleUserField != null
    && lawyerResponsibleUserField.Id != null)
{
    return Convert.ToString(workflowProperties != null 
            ? workflowProperties.Item[lawyerResponsibleUserField.Id] 
            : null
    )
}

假设这些属性是引用类型,可以是空值。

有很多方法可以检查空值和短路评估。一个好的建议是避免使用.ToString()实例方法并使用静态方法Convert.ToString(),如果传递的值为null,它不会抛出异常。返回值仍然可以为null,但至少您不必担心提供的参数。

答案 1 :(得分:3)

如果NullReferenceException本身为非空,则上述代码不会抛出myObjectField,除非MyObjectValue是值类型。您确定问题不在于使用 myObjectValue而不检查它是否为空?

但是,假设GetFieldValue返回object,最简单的方法就是使用临时变量:

object tmp = myObjectField.GetFieldValue();
if (tmp != null)
{
    MyObjectValue myObjectValue = (MyObjectValue) tmp;
    // Use myObjectValue here
}

显然,MyObjectValue是引用类型还是值类型,这将起作用。

编辑:既然您已经发布了完整的代码行,那么加载可能会抛出NullReferenceException的地方。我强烈建议您将这一行拆分为几个行,以了解发生了什么。

答案 2 :(得分:2)

C#6(Visual Studio 2015)介绍了Null-Conditionals(又名Elvis算子)......

而不是......

myObjectValue = (myObjectValue == null) ? null : myObjectValue.child;

可以使用以下内容......

myObjectValue = myObjectValue?.child;

答案 3 :(得分:1)

如果你想要真正安全:

MyObjectValue myObjectValue = null;

if(myObjectField != null)
{
    object temp = myObjectField.GetFieldValue();
    if(temp != null)
    {
        myObjectValue = (MyObjectValue)temp;
    }
}

答案 4 :(得分:1)

我觉得实际上myObjectField是空的,而不是myObjectField.GetFieldValue()。如果是这种情况,那么对null的简单检查就可以了:

 MyObjectValue myObjectValue;
if  (myObjectField == null)
{
    // recover
}
else 
{
    myObjectValue = (MyObjectValue) myObjectField.GetFieldValue();
}

几行调试代码会为您验证:

Console.WriteLine("myObjectField=" + myObjectField);

如果您看到null,那么myObjectField为空。

答案 5 :(得分:1)

您可能在其他地方出错;如果MyObjectValue是引用类型(class,而不是struct),那么在向您的类型转换null时应该没有异常。如果MyObjectValue是值类型(struct,而不是class),则无法为其指定空值。

您可以使用合并运算符来处理空值的大小写。

MyObjectValue value = (MyObjectValue)(field.GetFieldValue() ?? (object)someValidValue);

someValidValue表示在GetFieldValue返回null的情况下您希望将其用作默认值。这有点贵,因为必须装箱someValidValue以将其强制转换为对象,但这应该是您正在寻找的。

答案 6 :(得分:1)

Bellow建议只是空值的一个示例

如果object为null,则object.ToString()将引发错误

在下面的代码中,我使用 ComboBox 作为样本。

所以最好的方法是检查

// 1)
if (cmb.SelectedValue == null)
{
   // do something
}

如果你想使用内联

// 2)
string strValue = (cmb.SelectedValue ?? "-1").ToString();
// or
string strValue = cmb.SelectedValue == null ? "-1" : cmb.SelectedValue.ToString();

最后一种方法是处理错误

// 3)
string strValue = "";
try
{
   strValue = cmb.SelectedValue.ToString();
}
catch
{
  strValue = "-1";
}

答案 7 :(得分:0)

这应该有效。

if (myObjectField  != System.DBNull.Value))
{
    string variable = myObjectField.ToString();
}

答案 8 :(得分:0)

 public IQueryable GetOrderDetails()
    { 
        var _db = new ProductContext();
        IQueryable<OrderDetail> query = _db.OrderDetails;

        if (ddlOrder.SelectedValue != null && ddlOrder.SelectedItem != null)
        {
            var id = Convert.ToInt32(ddlOrder.SelectedValue);

            query = query.Where(p => p.Username == User.Identity.Name && p.OrderId == id);
                }   
       else{ query = null; ddlOrder.Visible = false;btnSubmit.Visible = false; }
        return query;
           }