静态类中const、readonly和get之间有什么区别?

18 浏览
0 Comments

静态类中const、readonly和get之间有什么区别?

这个问题已经有答案了

const和readonly在C#中有什么区别?

我有一个问题。最近我发现自己使用了3行代码,仔细检查后看起来和感觉都是相同的。

public static class constant
{
    public static readonly int val1 = 5;
    public const int val2 = 5;
    public static int val3 { get { return 5; } }
}

我的问题是,它们是一样的吗?应该使用其中之一吗?如果是这样。何时使用?

另外在Visual Studio中,为什么它们在智能感知中表示不同?

\"enter

admin 更改状态以发布 2023年5月19日
0
0 Comments

你可以在这篇文章中找到你问题的答案:

Static readonly vs const

你还可以检查IL代码并尝试自己比较结果。

0
0 Comments

声明为只读的成员可以在类的(静态)构造函数中更改,而const成员在运行时无法更改。

将字段声明为const会自动使其成为静态,引用自§10.3.7:

当字段,方法,属性,事件,运算符或构造函数声明包含静态修饰符时,它声明一个静态成员。此外,常量或类型声明隐式声明一个静态成员。

第三个只是一个只读属性,总是返回5。

如果可能的话,应优先使用const成员,以允许编译器和/或JIT执行其优化,并帮助其他人阅读代码(该属性对于我来说有点奇怪)。如果需要在程序启动期间初始化常数值(例如,机器的核心数),则必须使用静态只读成员。

这是C#规范(§10.5.2.1)的一个很好的例子:

当希望一个符号名称表示一个常量值,但该值的类型不允许在const声明中使用,或者该值无法在编译时计算时,静态只读字段会很有用。在下面的例子中,

public class Color
{
    public static readonly Color Black = new Color(0, 0, 0);
    public static readonly Color White = new Color(255, 255, 255);
    public static readonly Color Red = new Color(255, 0, 0);
    public static readonly Color Green = new Color(0, 255, 0);
    public static readonly Color Blue = new Color(0, 0, 255);
    private byte red, green, blue;
    public Color(byte r, byte g, byte b) {
        red = r;
        green = g;
        blue = b;
    }
}

Black、White、Red、Green和Blue成员无法声明为const成员,因为它们的值无法在编译时计算。但是,将它们声明为静态只读成员具有类似的效果。

另一个不同之处在于(§10.5.2.2): 常量和只读字段有不同的二进制版本控制语义。当表达式引用常量时,常量的值在编译时获得,但当表达式引用只读字段时,字段的值直到运行时才获得。因此,总的来说,它们非常不同,即使乍一看它们可能看起来相似,您应该使用最适合您意图的那一个。

0