我注意到 .NET 中的一个非常奇怪的行为,我花了一点时间才弄清楚发生了什么,因为对我来说,这并不直观。假设我有以下课程:
Public Class TestClass
Private Shared people As New Dictionary(Of Integer, Person)
Class Person
Public Property FirstName() As String
Public Property LastName As String
Public Sub SayMyName()
MsgBox(FirstName & " " & LastName)
End Sub
Public Sub New(FirstName As String, LastName As String)
Me.FirstName = FirstName
Me.LastName = LastName
End Sub
End Class
Shared Sub Test()
Dim checkPerson As Person = Nothing
With checkPerson
If (Not people.TryGetValue(3, checkPerson)) Then checkPerson = New Person("Bob", "Allen")
.SayMyName()
End With
End Sub
Shared Sub New()
people.Add(1, New Person("John", "Doe"))
people.Add(2, New Person("Jane", "Smith"))
End Sub
End Class
如果我调用TestClass.Test()
,则调用会引发 System.NullReferenceException SayMyName()
。如果我正在调试,则没有明显的空引用。我最终意识到这是因为当“with”块启动时引用为空,即使调试器显示它存在,CLR 仍将其视为空值。
显然,为了清晰起见,我的示例被简化了,但在我的真实代码中,在“with”块之外声明实例方式然后有条件地在块内分配它是有用的(即,如果之前没有在“With”之外分配它堵塞)。
有人对此有合理的解释吗?我知道我可以轻松解决这个问题,但我只是想知道人们对这种行为的想法或了解。