如何最好地在C#中实现可公开访问的常量

dev*_*xer 8 c# constants

在C#中实现可公开访问的常量似乎有三种选择.我很好奇是否有任何理由选择其中一个或者只是个人偏好.

选择1 - 私人领域加上财产获取者

private const string _someConstant = "string that will never change";

public string SomeConstant
{
    get { return _someConstant; }
}
Run Code Online (Sandbox Code Playgroud)

选择2 - 仅限属性吸气剂

public string SomeConstant
{
    get { return "string that will never change"; }
}
Run Code Online (Sandbox Code Playgroud)

选择3 - 仅限公共领域

public const string SomeConstant = "string that will never change";
Run Code Online (Sandbox Code Playgroud)

你推荐哪个,为什么?


更新

显然,这已成为讨论是否使用conststatic readonly.不完全是我的意图,但它确实告诉我,选择3绝对是一个坏主意,因为如果const的值在未来版本中发生变化,则需要重新编译所有引用程序集.

但是,我认为还没有人真正讨论过选择2.我仍然很好奇,如果只有一个getter返回一个值而没有别的东西有任何缺点.

Jon*_*eet 10

选择1和2实际上是等价的.

在我看来,实际上有三种不同的情况:

  • 你肯定知道字符串永远不会改变.在这种情况下,制作它是合理的const.(例如,Math.PI是const.这不会很快改变.)在使用过程中有一些微妙的内存含义static readonly,但它们不太可能影响你.如果值可能会发生变化,并且您不希望在该情况下重新编译所有调用方,则不应执行此操作,原因在于其他地方.请注意,对于许多项目(特别是内部公司项目),重新编译所有调用者确实不是问题.

  • 您认为字符串将来可能会发生变化,但您知道它在任何一个版本中始终都是常量.在这种情况下,一个public static readonly字段是可以的.请记住,使用字符串执行此操作是好的,因为它们是不可变的,但是您不应该使用任何可变类型(如数组)执行此操作.(公开不可变集合或使用属性并每次返回一个新副本.)

  • 您认为字符串可能会更改,甚至可能在程序的生命周期内更改...例如,"当前日期,格式化".在这种情况下,请使用公共静态只读属性(仅具有getter的属性).请注意,从只读字段更改为只读属性是兼容的更改,但不是与二进制兼容的更改 - 因此,如果您已经为我的第二个项目填充但需要更改为第三个项目,则需要重新编译一切.


pel*_*zem 5

考虑

public static readonly string myVar = "something";
Run Code Online (Sandbox Code Playgroud)

原因:当您暴露(然后在其他地方消费)a时const,const它嵌入在消费类型的元数据中.

A public static readonly不是,因为它static readonly只是一次性实例化你需要花费它,它就像一个不可变的一样const.

  • 为什么这是一个问题? (2认同)