2

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

我试图做的正是下面这篇文章的内容:

使用 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() 中是否写了一些东西来引发这样的错误?- NullReferenceException

If MyType Is Nothing Then Throw New NullReferenceException()

还是这里有更大的工作?所以假设如果我想编写像 iif 这样的函数,如果参数列表中的某些内容为 null,它将引发错误是上述方法的唯一方法吗?

4

3 回答 3

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() 运算符没有这个问题,因为它只是:一个运算符 此外,它是一个利用短路计算的运算符,因此只需要计算返回的表达式。If() 还具有类型安全的优点,但如果需要,您也可以在通用 IIF(Of T)() 函数中复制类型安全。

于 2011-03-28T03:32:26.323 回答
0

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

IIF 以它的方式工作,因为它是一个函数,而不是一个运算符

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

如果您的问题确实是要引发异常,则应使用上面的代码,但改为使用 throw 和ArgumentNullException,以便您可以指定哪个参数为空。

于 2011-03-28T03:28:25.067 回答
0

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

于 2011-03-28T03:31:56.113 回答