2011-04-20 49 views
1

使用CObj或DirectCast包裝參數將關閉編譯器,但該值仍未寫入。如何使用帶有Option Strict On的引用類型的Thread.VolatileWrite?

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 
+0

代碼示例真的有幫助... – 2011-04-20 14:38:26

回答

1

Thread.VolatileWrite沒有重載,它接受一個String參數。唯一支持的引用類型是Object。

由於VolatileWrite更新變量str,並且Option Strict處於On狀態,因此編譯器會抱怨,因爲理論上VolatileWrite可能會嘗試將值寫入該類型不是String類型的變量(編譯器只會看到它可能會寫入任何對象) 。事實上,由於VolatileWrite方法也只需要一個字符串,你可以編寫代碼來嘗試這樣做。它會因爲超出這個問題範圍的原因而失敗。

將表達式包裝在COjb/CType/DirectCast表達式中時(真的有括號),變量不再被認爲是變量而是值 - 它的處理方式與您只需鍵入字符串一樣字面在那裏。由於值沒有存儲位置,因此忽略VolatileWrite的ByRefness被忽略,這意味着它不再寫入,這意味着它不能再寫入錯誤的值,這意味着編譯器不再需要警告。

要獲取您想要的字符串類型變量的行爲,請在寫入之前和讀取之後使用System.Threading.Thread.MemoryBarrier方法。請參閱此主題以獲取更多信息:How do I specify the equivalent of volatile in VB.net?

相關問題