【问题标题】:How do I use Thread.VolatileWrite with reference types with Option Strict On?如何使用带有 Option Strict On 的引用类型的 Thread.VolatileWrite?
【发布时间】:2011-04-20 14:36:06
【问题描述】:

将参数包装在 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

【问题讨论】:

  • 一个代码示例真的很有帮助......

标签: vb.net option-strict


【解决方案1】:

没有采用 String 参数的 Thread.VolatileWrite 的重载。唯一支持的引用类型是 Object。

因为 VolatileWrite 正在更新变量 str 并且 Option Strict 是 On 编译器抱怨,因为理论上 VolatileWrite 可能会尝试向该变量写入一个非字符串类型的值(编译器只看到它可能写入任何对象)。事实上,由于 VolatileWrite 方法也只接受一个字符串,因此您可以编写尝试执行此操作的代码。由于超出此问题范围的原因,它会失败。

当您将表达式包装在 COjb/CType/DirectCast 表达式(实际上是任何带括号的表达式)中时,该变量不再被视为变量而是一个值 - 它的处理方式与您输入字符串文字的方式相同那里。由于值没有存储位置,因此 VolatileWrite 的 ByRefness 被忽略,这意味着它不再写入,这意味着它不能再写入错误的值,这意味着编译器不再需要警告。

要使用字符串类型变量获得所需的行为,请在写入之前和读取之后使用 System.Threading.Thread.MemoryBarrier 方法。有关更多信息,请参阅此线程:How do I specify the equivalent of volatile in VB.net?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多