vb.net:iif如何给出空引用异常?

时间:2011-03-28 02:51:10

标签: vb.net nullreferenceexception iif-function

一直在看很多关于使用Iif()的帖子/文章。当我尝试像C / C#/ C ++等那样使用像条件运算符这样的IIf()时,所有这一切都开始了。

我试图做的完全符合以下帖子的内容:

Using VB.NET IIF I get NullReferenceException

但是,我实施的解决方案是从以下msdn网站借来的:

http://msdn.microsoft.com/en-us/library/27ydhh0d%28v=vs.80%29.aspx

之后我才了解了vb.net中的If()方法。

所以最后我写了一个函数,它返回适当的值(使用反射)来达到目的。但是那个方法(我写的)没有抛出任何异常。事实上,我能够检查函数内部类型的可空性。

Function ReturnValue(ByVal MyType As SomeType, ByVal PropertyName as String) As Object
    If MyType Is Nothing Then Return String.Empty
    Dim arrPropInfo As PropertyInfo() = MyType.GetType().GetProperties()
    Return arrPropInfo.Where(Function(x) x.Name = PropertyName).Item(0).GetValue(MyType, Nothing)
End Function

我的问题是,是否有一些内容写在Iif()内以抛出这样的错误? - 一个NullReferenceException

If MyType Is Nothing Then Throw New NullReferenceException()

或者在这里有更大的工作吗?所以假设我想编写像iif这样的函数,如果参数列表中的某些内容为null,则会抛出错误,上述方法是唯一的方法吗?

3 个答案:

答案 0 :(得分:8)

区别在于?:If()运算符IIf()不是运营商;这是一个简单的旧功能。你甚至可以自己实现它:

Public Shared Function IIf(ByVal Expression As Boolean, ByVal TruePart As Object, ByVal FalsePart As Object) As Object
    If Expression Then Return TruePart Else Return FalsePart
End Function

这意味着传递给函数的所有参数必须在调用函数之前进行计算,就像任何其他函数一样。 IIF()内部没有任何内容抛出异常 - 它只是评估传递给函数的参数的正常过程。

您还需要注意,将null / Nothing传递给函数是完全可以的。您在代码中看到了异常,因为您传递的表达式具有无法计算的空引用 - 例如,如果您尝试使用空字符串变量的.Length属性。

另一方面,If()运算符没有这个问题,因为它只是:运算符而且,它是一个利用短路评估的运算符,这样只返回表达式需要评估。如果()也具有类型安全的优点,尽管你也可以在通用的IIF(Of T)()函数中复制类型安全,如果你想要的话。

答案 1 :(得分:0)

IIF与C ++不同:?至少在一个重要的方面,它总是评估两个表达式,所以你不能做IIF(X is nothing,DefaultValue,X.Value)之类的事情。它会抛出一个空引用异常,因为在X是什么的情况下,它仍将评估X.Value。

IIF以它的方式工作,因为它是一个功能,而不是一个操作员

你没有提供你如何使用IIF的代码所以我只是在猜测。我刚刚说的是您提供给MSDN的链接中的第一条评论,因此您可能已经知道这一点,或者这不是您的问题。

如果您的问题确实是想要抛出异常,那么您应该使用上面的代码,但抛出ArgumentNullException代替,这样您就可以指定哪个参数为null。

答案 2 :(得分:0)

您可以添加额外的ByRef参数,以指示函数中是否确实发生了异常。通过这种方式,我们可以消除捕获函数中引发的任何异常的需要。当然,你必须在该函数中添加Try ... Catch语句。