挥发性可以';不要用C#编译,也不要做它们

本文关键字:编译 挥发性 | 更新日期: 2023-09-27 18:27:52

我正在尝试编译以下代码:

internal volatile bool isRunning { get; set; }    

但编译失败,错误消息如下:"volatile修饰符对该元素无效"。但是以下代码将被编译为正确的:

internal volatile bool _isRunning;
internal bool isRunning{
    get { return _isRunning; }
    set { _isRunning = value; }
}

两个代码段之间有什么区别??

挥发性可以';不要用C#编译,也不要做它们

易失性(C#参考)

volatile关键字只能应用于类的字段或结构。局部变量不能声明为volatile。

对于Auto实现的属性或某个属性,编译器会创建一个可以通过get/set访问的专用支持字段。字段可以标记为volatile,但在Auto实现属性的情况下,您不会显式定义字段,因此无法将其标记为volatile。这就是为什么您的第一个代码(internal volatile bool isRunning { get; set; })片段没有编译的原因。

如果是第二个代码片段

internal volatile bool _isRunning;
internal bool isRunning{
    get { return _isRunning; }
    set { _isRunning = value; }
}

您正在通过属性isRunning封装_isRunning字段。字段_isRunning可以标记为volatile

一个带有getter和setter的属性实际上可以编译成C#中的方法。

internal volatile bool isRunning { get; }

想要

internal volatile bool getIsRunning()
{
    // Do something
}

该方法实际上没有存储任何内容,而私有成员是。