我正在使用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());
答案 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
以将其强制转换为对象,但这应该是您正在寻找的。 p>
答案 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;
}