【发布时间】:2010-12-15 23:48:55
【问题描述】:
我的程序使用了各种常量...string's、int's、double's 等...存储它们的最佳方式是什么?我不认为我想要一个Enum,因为数据不都是相同的类型,我想手动设置每个值。我应该将它们全部存储在一个空的类中吗?还是有更好的办法?
【问题讨论】:
-
任何你想要的方式 - 这就是你需要的方式。
我的程序使用了各种常量...string's、int's、double's 等...存储它们的最佳方式是什么?我不认为我想要一个Enum,因为数据不都是相同的类型,我想手动设置每个值。我应该将它们全部存储在一个空的类中吗?还是有更好的办法?
【问题讨论】:
IMO 使用一个充满常量的类对于常量来说是很好的。如果它们会偶尔更改,我建议在您的配置和 ConfigurationManager 类中使用 AppSettings。
当我有实际从 AppSettings 或类似内容中提取的“常量”时,我仍然会有一个包含来自配置管理器的读取的“常量”类。拥有Constants.SomeModule.Setting 而不是在任何想要使用所述设置值的地方直接求助于ConfigurationManager.AppSettings["SomeModule/Setting"] 总是更有意义。
此设置的加分项,因为SomeModule 可能是常量文件中的嵌套类,您可以轻松地使用依赖注入将SomeModule 直接注入到依赖它的类中。您甚至可以在SomeModule 之上提取一个接口,然后在您的消费代码中创建一个对ISomeModuleConfiguration 的依赖,这将允许您将依赖关系解耦到常量文件,甚至可能使测试更容易,特别是如果这些设置来自 AppSettings,您可以使用配置转换来更改它们,因为这些设置是特定于环境的。
【讨论】:
您可能可以将它们放在具有静态只读属性的静态类中。
public static class Routes
{
public static string SignUp => "signup";
}
【讨论】:
我喜欢做以下事情(但请确保阅读到最后以使用正确的常量类型):
internal static class ColumnKeys
{
internal const string Date = "Date";
internal const string Value = "Value";
...
}
Read this 了解为什么 const 可能不是您想要的。可能的常量类型是:
const 字段。如果值可能将来发生变化,请勿跨程序集使用(public 或protected),因为该值将在编译时在其他程序集中进行硬编码。如果更改该值,则其他程序集将使用旧值,直到重新编译它们。static readonly 字段static 没有 set 的属性
【讨论】:
一个空的静态类是合适的。考虑使用几个类,这样你就可以得到一组好的相关常量,而不是一个巨大的 Globals.cs 文件。
此外,对于某些 int 常量,请考虑以下表示法:
[Flags]
enum Foo
{
}
【讨论】:
是的,用于存储常量的static class 就可以了,但与特定类型相关的常量除外。
【讨论】:
再次投票支持使用 web.config 或 app.config。配置文件是连接字符串等常量的好地方。我不想查看源代码来查看或修改这些类型的东西。从 .config 文件中读取这些常量的静态类可能是一个很好的折衷方案,因为它可以让您的应用程序访问这些资源,就好像它们是在代码中定义的一样,但仍然可以让您灵活地将它们放在易于查看/可编辑的位置空间。
【讨论】:
这是 IMO 的最佳方式。不需要属性,或者只读:
public static class Constants
{
public const string SomeConstant = "Some value";
}
【讨论】:
const 是可以的。当属性或值可能在不同版本的程序之间发生变化时,请使用readonly。
如果这些常量是影响应用程序行为的服务引用或开关,我会将它们设置为应用程序用户设置。这样,如果需要更改它们,您不必重新编译,您仍然可以通过静态属性类引用它们。
Properties.Settings.Default.ServiceRef
【讨论】:
我建议使用静态只读的静态类。请在下面找到代码sn-p:
public static class CachedKeysManager
{
public static readonly string DistributorList = "distributorList";
}
【讨论】: