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

问题描述 投票:1回答:9

我正在使用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());
c# .net-2.0
9个回答
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,但至少您不必担心提供的参数。


4
投票

C#6(Visual Studio 2015)介绍了Null-Conditionals(又名Elvis运营商)......

而不是这个......

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

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

myObjectValue = myObjectValue?.child;

3
投票

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

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

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

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

编辑:现在您已经发布了完整的代码行,有很多地方可能会抛出NullReferenceException。我强烈建议你将这一行分成几行,以了解发生了什么。


1
投票

如果你想要真正安全:

MyObjectValue myObjectValue = null;

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

1
投票

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

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

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

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

如果你在那里看到null,那么它的myObjectField就是null。


1
投票

你可能在其他地方有错误;如果MyObjectValue是一个引用类型(class,而不是struct),那么在将null转换为你的类型时应该没有例外。如果MyObjectValue是一个值类型(struct,而不是class),那么你不能为它分配一个空值。

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

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

someValidValue返回GetFieldValue的情况下,null表示您想要使用的默认值。这是有点贵,因为铸造someValidValue必须装箱以将其投射到一个物体,但这应该做你想要的。


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";
}

0
投票

这应该工作。

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

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;
           }
© www.soinside.com 2019 - 2024. All rights reserved.