我使用.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)
可以是真的吗?
答案 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
,但对于Date
或Int32
等值类型,它将返回默认值(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