1

CObj または DirectCast で引数をラップすると、コンパイラはシャットダウンしますが、値はまだ書き込まれません。

Option Strict On
Imports System.Threading
Module Module1
    Dim str As String
    Sub Main()
        Thread.VolatileWrite(str, "HELLO") ' Compiler error.
        Thread.VolatileWrite(CObj(str), "HELLO") ' Fails silently.
        Thread.VolatileWrite(DirectCast(str), "HELLO") ' Fails silently.
        Console.WriteLine(str)
    End Sub
End Module
4

1 に答える 1

1

String引数を取るThread.VolatileWriteのオーバーロードはありません。サポートされている唯一の参照型はオブジェクトです。

VolatileWriteが変数strを更新していて、Option StrictがOnであるため、理論的にはVolatileWriteがString型ではない値をその変数に書き込もうとする可能性があるため、コンパイラは文句を言います(コンパイラはオブジェクトを書き込む可能性があることだけを認識します)。実際、VolatileWriteメソッドも文字列のみを受け取るため、これを実行しようとするコードを記述できます。この質問の範囲を超えた理由で失敗します。

式をCOjb/CType / DirectCast式(実際には括弧で囲まれたもの)でラップすると、変数は変数ではなく値と見なされます。文字列リテラルを入力する場合と同じように扱われます。値には格納場所がないため、VolatileWriteのByRefnessは無視されます。つまり、書き込みが行われなくなります。つまり、不正な値を書き込むことができなくなり、コンパイラが警告する必要がなくなります。

文字列型変数で必要な動作を取得するには、書き込み前と読み取り後にSystem.Threading.Thread.MemoryBarrierメソッドを使用します。追加情報については、このスレッドを参照してください:VB.netでvolatileに相当するものを指定するにはどうすればよいですか?

于 2011-08-01T18:50:09.513 に答える