4

私はこれを書いていました:

Private Sub Example()
Static CachedPeople As List(Of MyApp.Person)
If CachedPeople Is Nothing Then
    CachedPeople = New List(Of MyApp.Person)
End If
...rest of code...
End Sub

しかし、これを次のように減らすことができるかどうか疑問に思いました。

Private Sub Example()
Static CachedPeople As New List(Of MyApp.Person)
...rest of code...
End Sub

問題は、「New」ビットは、関数が最初に実行されたときに一度だけ実行されますが、次の呼び出しでは既に存在するということです。

乾杯、ロブ。

4

1 に答える 1

9

あなたが言及したように、それは一度だけ実行され、次の関数呼び出しで同じオブジェクトを参照します。ちなみに、最初のスニペットはスレッドセーフではありません。2 つのスレッドが同時に関数を呼び出すと、最終的にコンストラクターが 2 回実行される可能性がありますが、これは望ましくありません。2 番目のスニペットを使用すると、コンパイラが適切なコードを生成するため、手動でロックしてスレッド セーフを確保する必要がなくなります。

次のように宣言した場合は、

Static x As List(Of String)
x = New List(Of String)

毎回再現されていたでしょう。

于 2009-09-27T15:13:20.087 に答える