是否有可能有一个用于康斯特的吸气剂

本文关键字:康斯特 有可能 有一个 用于 是否 | 更新日期: 2023-09-27 18:32:36

只是好奇,有没有办法为常量变量提供一个getter?我有一种内部版本号,以确保库的两个版本仍然使用相同的语言,但我希望程序员能够检查他们正在使用的版本。现在我使用:

 private const Int16 protocol_version = 1;
 public Int16 ProtocolVersion => protocol_version;

但如果有办法,我宁愿只用 const 来做。

是否有可能有一个用于康斯特的吸气剂

你可以声明一个只带有 get 访问器的属性(甚至不声明 set 访问器,甚至不是私有的(:

private const Int16 protocol_version = 1;
public Int16 ProtocolVersion => protocol_version;

这与仅定义常量不同:常量将在编译时解析,因此,如果您在不重新编译依赖程序的情况下更新库,程序仍将看到"旧"值。请考虑以下示例:

// The class library
using System;
namespace MyClassLibrary {
    public class X {
        public const Int16 protocol_version = 1;
        public Int16 ProtocolVersion => protocol_version;
    }
}
// The program
using System;
using MyClassLibrary;
class Program {
    static void Main(string[] args) {
        var x = new X();
        Console.WriteLine($"Constant: {X.protocol_version0}");
        Console.WriteLine($"Getter: {x.ProtocolVersion}");
    }
}

现在,第一次编译并执行程序。你会看到

Constant : 1
Getter : 1

然后,将protocol_version修改为 2,并且仅重新编译类库,而不重新编译程序,然后将新的类库放入程序文件夹中并执行它。您将看到:

Constant : 1
Getter : 2

事实是,如果它只是一个常量,则在编译时替换该值。

我认为您实际上正在寻找的是一个static readonly变量:这样,您将避免编译时 const 替换,并且该变量在初始化后将无法修改:

public static readonly Int16 protocol_version = 1;

你必须记住getter/setters存在的原因。它是控制对封装变量的访问,特别是控制变量的更改方式以及谁可以更改它。由于 const 仅设置一次,并且在运行时保持只读状态,因此没有理由为其创建属性。将常量设置为 public 是完全可以接受的,因为它不是需要保护的私有变量。

如果你真的...真的想让它成为一个属性,那么只需将其定义为只读属性,完全跳过 setter:

public Int16 ProtocolVersion => protocol_version;

但为了清楚,我想说的是,通常情况下,你会有与属性具有相同编码风格的公共常量:

public const Int16 ProtocolVersion = 1

只需执行以下操作:

public const Int16 protocol_version = 1;

这将提供一个公共获取者,因为const不能有二传手。

量不能重新分配,因此为什么它们被称为常量,因此只需protocol_version public

private const Int16 protocol_version = 1;