存储程序使用的一组常量的最佳方法是什么?

Mat*_*hew 93 c# constants

我有我的程序使用...各种常数string的,int的,double的,等...什么是存储它们的最好方法?我不认为我想要一个Enum,因为数据不是所有相同的类型,我想手动设置每个值.我应该把它们全部存放在一个空的课堂上吗?或者,还有更好的方法?

Dan*_*ite 127

您可能将它们放在静态类中,具有静态只读属性.

public static class Routes
{
    public static string SignUp => "signup";
}
Run Code Online (Sandbox Code Playgroud)

  • const的问题是,任何针对consts编译的程序集在编译时都会获得这些consts的本地副本; 因此,如果更改值,则还必须重新编译依赖于定义常量的程序集的所有程序集 - 因此,通常更安全地使用只读路径.如果需要,属性而不是公共静态值使您可以灵活地在将来添加一些编程逻辑(即从本地化读取),而无需将接口更改为常量值. (87认同)
  • +1,但如果您可以从资源文件中提取这些内容以进行本地化,则会更好. (22认同)
  • 看起来有点罗嗦 - 为什么不是静态只读字符串? (16认同)
  • 作为魔鬼的拥护者,我必须指出const的优点是你可以在开关案例中使用它. (10认同)
  • 为什么只读而不是常量?您没有在运行时设置该值,因此不需要将它们设置为只读. (6认同)
  • @Joel - 仅当用户看到该值时。 (2认同)
  • 听起来不错.就像emptyset说的那样,有没有理由在这里使用属性而不是静态只读字符串? (2认同)
  • 我喜欢在 intellesense tehe 中拥有属性图标。 (2认同)
  • 我个人去了常量路由,但是声明包含它们的类是内部的,所以它们不能在程序集之外使用,并且消除了它们在其他程序集中没有更新的问题.当然,如果你在装配之外需要它们,这没有任何帮助.它确实让我高枕无忧,其他人不能在没有明确更改类修饰符的情况下在程序集之外使用它们. (2认同)

Chr*_*sic 26

IMO使用一个充满常量的类对常量很好.如果他们偶尔会改变,我建议在配置和ConfigurationManager类中使用AppSettings.

当我有"常量"实际从AppSettings或类似的东西中拉入时,我仍然会有一个"常量"类来包装配置管理器的读数.拥有Constants.SomeModule.Setting而不是直接诉诸ConfigurationManager.AppSettings["SomeModule/Setting"]任何想要消耗所述设定值的地方总是更有意义.

此设置的加分点,因为SomeModule可能是Constants文件中的嵌套类,您可以轻松地使用依赖注入SomeModule直接注入依赖它的类.你甚至SomeModule可以ISomeModuleConfiguration在你的消费代码中提取一个接口,然后创建一个依赖性,这将允许你将依赖关系解耦到Constants文件,甚至可能使测试更容易,特别是如果这些设置来自AppSettings和您使用配置转换更改它们,因为设置是特定于环境的.


Mar*_*lin 18

我喜欢做的是以下内容(但请务必阅读到最后使用正确类型的常量):

internal static class ColumnKeys
{
    internal const string Date = "Date";
    internal const string Value = "Value";
    ...
}
Run Code Online (Sandbox Code Playgroud)

阅读本文以了解为什么const可能不是您想要的.可能的常量类型是:

  • const领域.如果将来值可能会更改,请不要跨程序集(publicprotected)使用,因为该值将在编译时在其他程序集中进行硬编码.如果更改该值,则其他程序集将使用旧值,直到重新编译它们为止.
  • static readonly 领域
  • static 财产没有 set

  • Const值从源程序集复制到已编译的代码中.这意味着如果您必须更改const值,则必须针对新版本重新编译所有相关程序集.使用静态只读更安全,更方便. (14认同)
  • const的好处是它们可以用在交换机中 (6认同)

Phi*_*ace 11

这是IMO的最佳方式.不需要属性或只读:

public static class Constants
{
   public const string SomeConstant = "Some value";
}
Run Code Online (Sandbox Code Playgroud)

  • 如果要使用const,则仅作为内部公开.不要公开const(即使您认为您的程序集不会在您的组织外部使用).此外,属性还为您提供了编程灵活性,以便将来扩展,而无需重新定义您的界面. (8认同)