我正在使用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());
在.
的任何地方,它代表成员访问,如果左侧是引用类型(类),它可以为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,但至少您不必担心提供的参数。
C#6(Visual Studio 2015)介绍了Null-Conditionals(又名Elvis运营商)......
而不是这个......
myObjectValue = (myObjectValue == null) ? null : myObjectValue.child;
可以使用以下内容......
myObjectValue = myObjectValue?.child;
如果NullReferenceException
本身是非null,则上面的代码不会抛出myObjectField
,除非MyObjectValue
是值类型。你确定问题不在于你是否正在使用myObjectValue
而不检查它是否为空?
但是,假设GetFieldValue
返回object
,最简单的方法就是使用临时变量:
object tmp = myObjectField.GetFieldValue();
if (tmp != null)
{
MyObjectValue myObjectValue = (MyObjectValue) tmp;
// Use myObjectValue here
}
显然,无论MyObjectValue
是引用类型还是值类型,这都将起作用。
编辑:现在您已经发布了完整的代码行,有很多地方可能会抛出NullReferenceException。我强烈建议你将这一行分成几行,以了解发生了什么。
如果你想要真正安全:
MyObjectValue myObjectValue = null;
if(myObjectField != null)
{
object temp = myObjectField.GetFieldValue();
if(temp != null)
{
myObjectValue = (MyObjectValue)temp;
}
}
我有一种感觉,实际上myObjectField
是空的,而不是myObjectField.GetFieldValue()
。如果是这种情况,那么对null的简单检查就可以了:
MyObjectValue myObjectValue;
if (myObjectField == null)
{
// recover
}
else
{
myObjectValue = (MyObjectValue) myObjectField.GetFieldValue();
}
几行调试代码会为您验证:
Console.WriteLine("myObjectField=" + myObjectField);
如果你在那里看到null
,那么它的myObjectField
就是null。
你可能在其他地方有错误;如果MyObjectValue
是一个引用类型(class
,而不是struct
),那么在将null
转换为你的类型时应该没有例外。如果MyObjectValue
是一个值类型(struct
,而不是class
),那么你不能为它分配一个空值。
您可以使用合并运算符来处理空值的大小写。
MyObjectValue value = (MyObjectValue)(field.GetFieldValue() ?? (object)someValidValue);
在someValidValue
返回GetFieldValue
的情况下,null
表示您想要使用的默认值。这是有点贵,因为铸造someValidValue
必须装箱以将其投射到一个物体,但这应该做你想要的。
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";
}
这应该工作。
if (myObjectField != System.DBNull.Value))
{
string variable = myObjectField.ToString();
}
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;
}