2011-04-20 2 views
1

CObj 또는 DirectCast에서 인수를 래핑하면 컴파일러가 종료되지만 값은 계속 쓰여지지 않습니다.Thread.VolatileWrite를 Option Strict On이 설정된 참조 유형과 함께 사용하려면 어떻게해야합니까?

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

코드 샘플이 정말 도움이 될 것입니다 ... –

답변

1

String 인수를 취하는 Thread.VolatileWrite의 오버로드가 없습니다. 지원되는 유일한 참조 유형은 Object입니다.

VolatileWrite가 str 변수를 업데이트하고 Option Strict가 On이기 때문에 이론적으로 VolatileWrite가 String 유형이 아닌 해당 변수에 값을 쓰려고 시도 할 수 있으므로 컴파일러가 불평합니다 (컴파일러는 Object를 쓸 수 있음을 확인) . 사실, VolatileWrite 메소드는 String을 취하므로이 작업을 시도 할 코드를 작성할 수 있습니다. 이 질문의 범위를 벗어나는 이유로 실패 할 수 있습니다.

식을 COjb/CType/DirectCast 식 (실제로 괄호 포함)으로 래핑하면 변수는 더 이상 변수가 아니라 값으로 간주됩니다. 문자열을 입력하는 것과 같은 방식으로 처리됩니다 거기에 문자 그대로. 값에 저장 위치가 없기 때문에 VolatileWrite의 ByRefness는 무시됩니다. 즉, 더 이상 쓸 수 없다는 것을 의미합니다. 즉 더 이상 컴파일러가 더 이상 경고 할 필요가 없다는 것을 의미하는 잘못된 값을 쓸 수 없음을 의미합니다.

문자열 형식 변수로 원하는 동작을 얻으려면 쓰기 전에 및 읽은 후에 System.Threading.Thread.MemoryBarrier 메서드를 사용하십시오. 자세한 내용은이 스레드를 참조하십시오. How do I specify the equivalent of volatile in VB.net?

관련 문제