【问题标题】:Difference between static and const variables [duplicate]静态变量和常量变量之间的区别[重复]
【发布时间】:2015-08-11 12:51:37
【问题描述】:

在声明全局变量时,“static”和“const”有什么区别;

namespace General
{
    public static class Globals
    {
        public const double GMinimum = 1e-1;

        public const double GMaximum = 1e+1;
    }
}

哪个更好(考虑到这些变量永远不会改变)

namespace General
{
    public static class Globals
    {
        public static double GMinimum1 = 1e-1;

        public static double GMaximum1 = 1e+1;
    }
}

【问题讨论】:

  • 在第二个中,我可能会不小心转到General.Globals.GMaximum1 = 2,它会搞砸很多其他地方。只有第一个对于不应更改的内容是安全的,除非您也将静态声明为 readonly

标签: c# variables static constants global


【解决方案1】:

const 和 readonly 对数据成员执行类似的功能,但它们有一些重要的区别。 常量成员是在编译时定义的,不能在运行时更改。常量使用 const 关键字声明为字段,并且必须在声明时进行初始化。

static 修饰符用于声明静态成员,这意味着该成员不再与特定对象绑定。该值属于该类,此外,无需创建该类的实例即可访问该成员。静态字段和事件只存在一份,静态方法和属性只能访问静态字段和静态事件

【讨论】:

  • “不再绑定到特定对象”是否意味着使用相同静态变量名称的多个对象会混淆值?我只是发现我的大多数静态变量都有效,但有些返回的是 我认为 是来自不同类的值。不可靠可能是两者之间的重要区别。
  • @user1566694 我会告诉你static keyword的文档。您应该使用类名访问静态成员以消除歧义Foo.Bar 将是类Foo 上的静态属性,无需Foo 的实例即可访问。如果你不消除歧义,就会陷入混乱的境地。
【解决方案2】:

const 变量在编译后永远无法更改。它们适用于真正恒定的事物(即 pi)

static 成员是共享内存,特定类的所有实例都可以访问,如果使用诸如 public 之类的访问修饰符(这些可能感觉像 javascript 等语言中的全局变量),则更多。静态成员的行为类似于可以随时重新分配的普通变量。

在您的情况下,如果保证数字永远不会改变,则将它们设为 const。如果它们确实发生了变化,您将不得不使用新值重新编译程序。


哪个更好?如果您使用const,那么文字值会被烘焙到程序集中并提供性能提升。

如果需要更改值,那么更改源代码和快速重新编译所花费的时间会破坏这种边际性能提升。

【讨论】:

    【解决方案3】:

    const 是一个常数值,不能更改。它被编译到程序集中。

    static 表示它是一个与实例无关的值,可以在运行时更改(因为它不是readonly)。

    因此,如果值从未更改,请使用 consts。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-20
      • 2012-05-14
      • 2018-12-22
      • 2011-01-14
      • 2016-03-22
      相关资源
      最近更新 更多