【问题标题】:Can object.Equals(Nothing) ever be true?object.Equals(Nothing) 可以是真的吗?
【发布时间】:2014-08-08 19:54:27
【问题描述】:

我正在使用 .NET Framework 3.5 浏览 VB.NET 中的一些旧代码库(ASP.NET 和 VB.NET 在代码隐藏中),我经常看到:

Dim ddlSomeDropDown As DropDownList
ddlSomeDropDown = CType(fvSomeFormView.FindControl("ddlSomeDropDown"), DropDownList)

If Not ddlSomeDropDown.Equals(Nothing) Then
    '...

据我了解,这是一种保护措施,但如果 ddlSomeDropDown 恰好是 Nothing,那么在调用其 .Equals 函数时会出现空引用异常,不是吗?那么,ddlSomeDropDown.Equals(Nothing) 在这种情况下是真的吗?或者,anyObject.Equals(Nothing) 会是真的吗?

【问题讨论】:

标签: vb.net .net-3.5


【解决方案1】:

我经常看到这个:

你在哪里看到的。如果控件是Nothing,它将抛出NullrefernceException

.. 据我了解,这是一种保护措施,但如果 ddlSomeDropDown 曾经 正好是Nothing,会有空引用异常

没错。这不是保障。

那么,anyObject.Equals(Nothing) 会是真的吗?

如果你愿意,当然可以:

Public Class TypeWithStrangeEquals
    Public Overrides Function Equals(obj As Object) As Boolean
        If obj Is Nothing Then
            Return True
        Else
            ' ...'
        End If
    End Function
End Class

这有意义吗?不,这是不好的做法。

MSDN:

Equals 的实现不能抛出异常;他们应该 总是返回一个值。例如,如果 obj 为 Nothing,则 Equals 方法应该返回 false 而不是抛出 ArgumentNullException。

您可以使用Shared 方法Object.Equals(obj1, obj2),但如果一个或两个对象是Nothing,它将返回False

MSDN:

它确定 objA 或 objB 是否为空。如果是,则返回 假的。

编辑:正如在 VB.NET 中的注释 Nothing 中正确提到的 pmcoltrane 与 C# 中的 default 具有相同的效果,它将返回给定类型的默认值。对于引用类型,它表示(与 C# 相同)null,但对于像 DateInt32 这样的值类型,它将返回默认值(01/01/0001 00:00:00 表示日期,0 表示数值)。

这就是为什么返回 True:

Dim isZeroNothing = 0.Equals(Nothing) ' true

顺便说一句,在 C# 中这是 false,因为 null 没有 default 效果:

bool isZeroNothing = 0.Equals(null);  // false

【讨论】:

  • 我知道 OP 谈到了调用 Equals 的实例,当然这会引发异常 NULL.Equals(something)
  • @Steve:我希望我现在已经澄清了它无助于防止 NullRefernceException。这根本没有任何意义,我也从未见过。
  • 这可能发生在值类型上,因为Nothing 似乎意味着default。您可以在控制台上写Dim i as Integer = Nothing : Dim j as Integer? = Nothing : Console.WriteLine(i.Equals(Nothing)) : Console.WriteLine(j.Equals(Nothing)) 并看到True 两次。不过,它并不真正适用于 DropDownList。
【解决方案2】:

如果您尝试在空(无)实例上调用任何方法,您将获得NullReferenceException。这是给定的。

这些行很危险,因为如果碰巧返回 Nothing ,那么您的代码就会陷入困境。
我会将这些行替换为

If ddlSomeDropDown IsNot Nothing Then

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 2022-11-11
    • 2013-04-02
    相关资源
    最近更新 更多