【问题标题】:vb.net: how is iif giving a null reference exception?vb.net:iif 如何给出空引用异常?
【发布时间】:2011-03-28 02:51:09
【问题描述】:

查看了很多关于使用 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,它会抛出错误,这是上述方法的唯一方法吗?

【问题讨论】:

    标签: vb.net nullreferenceexception iif-function


    【解决方案1】:

    区别在于?: 和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)() 函数中复制类型安全。

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-08-04
          • 1970-01-01
          • 2021-04-29
          • 2022-01-05
          • 1970-01-01
          • 1970-01-01
          • 2014-09-06
          • 2014-07-19
          相关资源
          最近更新 更多