看了很多关于使用 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语句。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top