当前位置:  开发笔记 > 编程语言 > 正文

为什么readonly和volatile修饰符是互斥的?

如何解决《为什么readonly和volatile修饰符是互斥的?》经验,为你挑选了1个好方法。

我有一个引用类型变量readonly,因为引用永远不会改变,只有它的属性.当我试图将volatile修饰符添加到它时,编译警告我它不会让两个修饰符都适用于同一个变量.但我认为我需要它是易变的,因为我不想在阅读其属性时遇到缓存问题.我错过了什么吗?或者编译器错了?

更新如Martin在以下评论中所述:在引用类型对象的情况下,readonly和volatile修饰符仅适用于引用,而不适用于对象的属性.这就是我所缺少的,所以编译器是正确的.

class C
{
    readonly volatile string s;  // error CS0678: 'C.s': a field cannot be both volatile and readonly
}

P Daddy.. 16

这些readonlyvolatile修饰语都不具有渗透性.它们适用于引用本身,而不是对象的属性.

readonly关键字断言和强制执行,一个变量初始化后不能更改.变量是存储引用的小块内存.

volatile关键字告诉编译器多个线程可能会更改变量的内容.这可以防止编译器使用优化(例如将变量的值读入寄存器并在多个指令上使用该值),这可能会导致并发访问问题.同样,这仅影响存储引用的小块内存.

以这种方式应用,您可以看到它们确实是互斥的.如果某些内容是只读的(只能在初始化或构造时写入一次),那么它也不能是易失性的(可以由多个线程随时写入).


至于你对缓存问题的关注,IIRC,关于何时编译器可以缓存属性调用的结果,有非常严格的规则.请记住,这一个方法调用,它是一个非常重的优化(从编译器的立场)来缓存它的值并跳过再次调用它.我不认为这是你需要过多地关注自己的事情.



1> P Daddy..:

这些readonlyvolatile修饰语都不具有渗透性.它们适用于引用本身,而不是对象的属性.

readonly关键字断言和强制执行,一个变量初始化后不能更改.变量是存储引用的小块内存.

volatile关键字告诉编译器多个线程可能会更改变量的内容.这可以防止编译器使用优化(例如将变量的值读入寄存器并在多个指令上使用该值),这可能会导致并发访问问题.同样,这仅影响存储引用的小块内存.

以这种方式应用,您可以看到它们确实是互斥的.如果某些内容是只读的(只能在初始化或构造时写入一次),那么它也不能是易失性的(可以由多个线程随时写入).


至于你对缓存问题的关注,IIRC,关于何时编译器可以缓存属性调用的结果,有非常严格的规则.请记住,这一个方法调用,它是一个非常重的优化(从编译器的立场)来缓存它的值并跳过再次调用它.我不认为这是你需要过多地关注自己的事情.

推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有