.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()
ます。私がデバッグしている場合、明らかな null 参照はありません。「with」ブロックが開始されたときに参照がnullであり、デバッガーが存在することを示していても、CLRによってまだそのように扱われているためであることに最終的に気付きました。
明らかに、私のサンプルはわかりやすくするために単純化されていますが、私の実際のコードでは、「with」ブロックの外側でインスタンスを宣言し、条件付きでブロック内に割り当てると便利です (つまり、「With」の外側で以前に割り当てられていなかった場合)。ブロック)。
誰もこれについて合理的な説明を持っていますか? これを簡単に回避できることはわかっていますが、この動作について人々がどう考えているか、または知っているかを知りたいだけです。