【问题标题】:Why const keyword was introduced in C# compiler? [duplicate]为什么在 C# 编译器中引入了 const 关键字? [复制]
【发布时间】:2015-10-20 15:31:08
【问题描述】:

C#相关

场景 1: 类中的只读关键字字段/数据成员将仅初始化一次。因此,该类的多个实例将存在该只读数据成员的不同值。该类中的方法和属性永远不会修改此数据成员。

场景 2: 类中的 const 关键字字段/数据成员将仅在同一语句中声明和初始化一次。否则编译器会产生错误。在这种情况下,标记为 const 的数据成员将为为此类创建的多个实例保存相同的值。

场景2也可以使用静态变量来实现。

那为什么在 C# 中需要有 const 关键字呢?

【问题讨论】:

    标签: c#


    【解决方案1】:

    静态变量可以随时更改 - 它们只是类类型中的单例。

    只读变量只能在运行时设置一次。但是每次访问它们时都会从程序集中读取它们。它们可以是静态的或每个实例的值。

    常量是编译时常量。它们不在运行时评估,而是在编译客户端程序集时评估。如果编译器愿意,它们可能会被内联到您的代码中。

    常量也可以在方法中使用,所以它们的值只能在方法的范围内使用(不同于只读和静态)

    因此,常量、只读和静态都彼此显着不同。

    【讨论】:

    • 想必,内联 const 的原因是为了提高性能,与 readonly 相比?
    • 是的,一个 const 值几乎总是会出现在处理器执行的指令流中。只读变量将需要内存访问。当您计算纳秒时,差异很大。然而,使用 public const 是一种非常邪恶的微优化。
    • @Jason,假设一个静态变量被赋予一个值 x。执行 10 分钟后,值变为 y。然后在修改后值 y 将被所有实例使用,并且当值为 x 时做出的任何决定都将无效。这个有实际用途吗?
    • @Sam,静态变量意味着类的所有实例共享一个“全局”变量,而不是每个实例都有自己的私有副本。
    • ...所以想象一下,您为类创建的每个实例都需要一个唯一的 ID。使用静态变量,这很容易。 “下一个唯一 ID”从 1 开始,每次需要新 ID 时递增 - 类的所有实例都看到将使用的“下一个 ID”的相同编号。然后每个对象可能有一个非静态成员变量来存储其自己的唯一 ID,因此在其构造函数中,它从静态变量设置其唯一 ID,然后递增静态变量,确保每个新的实例获得不同且唯一的 ID。
    猜你喜欢
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多