关于c#:存储程序使用的一组常量的最佳方法是什么?

What's the best way to store a group of constants that my program uses?

我有我的程序使用的各种常量…stringintdouble等……储存它们的最佳方法是什么?我不认为我需要一个Enum,因为数据的类型不同,我想手动设置每个值。我应该把它们都放在空教室里吗?还是有更好的方法?


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

1
2
3
4
public static class Routes
{
    public static string SignUp =>"signup";
}


对于常量,使用一个充满常量的类是可以的。如果它们会偶尔发生变化,我建议您在配置和configurationmanager类中使用appsettings。

当我有"常量"实际上是从appsettings或类似文件中拉入时,我仍然会有一个"常量"类来包装从配置管理器中读取的内容。在任何想要使用设定值的地方,使用Constants.SomeModule.Setting而不是直接使用ConfigurationManager.AppSettings["SomeModule/Setting"]总是更有意义的。

由于SomeModule很可能是常量文件中的嵌套类,因此可以轻松地使用依赖注入将SomeModule直接注入依赖它的类中。您甚至可以提取SomeModule之上的接口,然后在消费代码中创建对ISomeModuleConfiguration的依赖关系,这将允许您分离对常量文件的依赖关系,甚至可能使测试更容易,特别是如果这些设置来自appsettings,并使用config transforma更改它们因为这些设置是环境特定的。


我喜欢做的是以下操作(但请务必从头到尾阅读以使用适当类型的常量):

1
2
3
4
5
6
internal static class ColumnKeys
{
    internal const string Date ="Date";
    internal const string Value ="Value";
    ...
}

读这个来了解为什么const可能不是你想要的。可能的常量类型有:

  • const字段。如果将来值可能发生变化,则不要在程序集(publicprotected之间使用,因为该值将在编译时在这些其他程序集中进行硬编码。如果更改该值,则其他程序集将使用旧值,直到重新编译它们。
  • static readonly字段
  • setstatic财产


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

1
2
3
4
public static class Constants
{
   public const string SomeConstant ="Some value";
}


空静态类是合适的。考虑使用几个类,这样就可以得到一组好的相关常量,而不是一个巨大的globals.cs文件。

另外,对于一些int常量,考虑符号:

1
2
3
4
[Flags]
enum Foo
{
}

因为这允许将值视为标志。


使用web.config或app.config的另一个投票。对于连接字符串等常量来说,配置文件是一个很好的位置。我不希望看到源代码来查看或修改这些类型的内容。从.config文件中读取这些常量的静态类可能是一个很好的折衷方案,因为它可以让应用程序像在代码中定义的那样访问这些资源,但仍然可以灵活地将它们放在易于查看/编辑的空间中。


是的,用于存储常量的static class就可以了,除了与特定类型相关的常量。


我建议用静态只读的静态类。请在下面找到代码段:

1
2
3
4
  public static class CachedKeysManager
    {
        public static readonly string DistributorList ="distributorList";
    }

如果这些常量是影响应用程序行为的服务引用或开关,我会将它们设置为应用程序用户设置。这样,如果需要更改它们,就不必重新编译,您仍然可以通过静态属性类引用它们。

1
Properties.Settings.Default.ServiceRef