静态变量和常量变量的区别

19

在声明全局变量时,“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”。 - Ron Beyer
更多内容请参考:https://dev59.com/Y3E95IYBdhLWcg3wp_qn - Nitin Aggarwal
3个回答

26

constreadonly 在数据成员方面扮演着相似的角色,但它们之间有一些重要的区别。 常量成员在编译时被定义,且不能在运行时更改。常量是使用 const 关键字声明为字段,并且必须在声明时进行初始化。

static 修饰符用于声明静态成员,这意味着该成员不再与特定对象关联。该值属于类,此外,成员可以在不创建类实例的情况下访问。只存在一个 static 字段和事件的副本,静态方法和属性只能访问 static 字段和 static 事件。


“不再绑定到特定对象”是否意味着使用相同静态变量名称的多个对象可能会混淆值?我刚刚发现我的大多数静态变量都可以工作,但有些返回我认为是来自不同类的值。不可靠可能是两者之间的重要区别。 - user1566694
1
@user1566694 我会为你指引 static 关键字 的文档。你应该使用类名来访问静态成员以消除歧义,例如 Foo.Bar 是类 Foo 上的静态属性,可以在不需要 Foo 实例的情况下访问。如果你没有消除歧义,可能会陷入困惑的境地。 - t3dodson

14

const变量在编译后不能被改变,它们适用于真正是常数的东西(例如 pi)。

static成员是共享内存,所有特定类的实例都可以访问它,如果使用public等访问修饰符,则更像是JavaScript等语言中的全局变量。静态成员表现得像普通变量一样,可以随时重新分配。

在您的情况下,如果这些数字保证永远不会改变,则将其设置为const。如果它们改变了,您就需要使用新值重新编译程序。


哪一个更好? 如果使用const,则字面值将嵌入到汇编代码中,并提供性能提升。

如果这些值需要更改,则更改源代码并重新编译所需的时间会迅速破坏此轻微的性能提升。


12

const 是一个常量值,不能被更改。它被编译为汇编代码。

static 意味着它是与实例无关的值,可以在运行时更改(因为它不是 readonly)。

如果这些值从不更改,请使用 const


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接