可以object.Equals(没什么)永远是真的吗?

时间:2014-08-08 19:54:27

标签: vb.net .net-3.5

我使用.NET Framework 3.5浏览VB.NET中的一些旧代码库(使用VB.NET代码隐藏的ASP.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)可以是真的吗?

2 个答案:

答案 0 :(得分:2)

  经常我看到这个:

你在哪里看到这个。如果控件为NullrefernceException,它将抛出Nothing

  

..据我了解,这是一个安全措施,但如果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),但如果其中一个或两个对象为False,则会返回Nothing

MSDN

  

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

编辑:正如在VB.NET中的评论Nothing中正确提到的pmcoltrane与C#中的default具有相同的效果,它将返回给定的默认值类型。对于引用类型,它意味着(与C#相同)null,但对于DateInt32等值类型,它将返回默认值(01/01/0001 00:00:00表示日期和{{1数字值)。

这就是为什么这会返回0

True

顺便说一句,在C#中,这是Dim isZeroNothing = 0.Equals(Nothing) ' true ,因为false没有null - 效果:

default

答案 1 :(得分:0)

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

这些线条是危险的,因为如果它碰巧没有任何东西,那么你的代码陷入困境 我会用

替换这些行
If ddlSomeDropDown IsNot Nothing Then