VB.net:iif 如何给出空引用异常?
-
12-11-2019 - |
题
看了很多关于使用 Iif() 的帖子/文章。所有这一切都是从我尝试在 C/C#/C++ 等中像条件运算符一样使用 IIf() 时开始的。
我试图做的正是以下帖子中的内容:
使用 VB.NET IIF 我得到 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() 内部是否写了一些东西来抛出这样的错误?- 空引用异常
If MyType Is Nothing Then Throw New NullReferenceException()
还是有更大的事情在起作用?所以假设如果我想编写像 iif 这样的函数,如果参数列表中的某些内容为空,它将抛出错误,上面的方法是唯一的方法吗?
解决方案
区别在于 ?:
和 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() 运算符没有这个问题,因为它只是:此外,它是一个利用短路求值的运算符,因此只需要对返回的表达式进行求值。If() 还具有类型安全的优点,不过如果您愿意,也可以在通用 IIF(Of T)() 函数中复制类型安全。
其他提示
iif与c ++不同:?至少有一个重要的方式,它总是评估两个表达式,这样你就不能这样做像素的东西。它会抛出一个null参考例外,因为在x x中没有,它仍然会评估x.value。
iif工作方式是因为它是一个函数,而不是运算符
您没有为您使用IIF提供的代码,所以我只是猜测。我刚才所说的是你提供给MSDN的链接的第一个评论,所以你可能已经知道这一点,或者这不是你的问题。
如果您的问题实际上是您想要抛出异常,您应该使用上面的代码,但掷和 cargumentnullexception ,所以你可以指定null的一个参数。
您可以添加额外的byref参数,以指示是否确实存在异常函数。通过这种方式,我们可以消除需要在功能中提出的任何异常。当然,你必须在该功能中添加尝试... Catch语句。