使用Globals Constants的正确方法

在几乎每个项目中,我都无法决定如何处理某些全局常量值。 在过去的日子里,当我编写没有使用dll的C ++程序时,很容易。 只需创建和.h文件,其中包含一些描述项目某些常量值的const 。 然后我把每个文件包含在内,并且ta-da! 有效。 清洁,尊重DRY原则并且很简单。

现在我的项目是C#.Net,它为我提供了大量的选项来解决这个问题。 据我所知:

  1. 创建一个程序集,其唯一目的是为项目保存常量值。 然后,每个其他大会都应参考这一个 。 我尊重DRY和KISS,因为添加引用很简单。 这里的主要问题是我需要重新编译整个源来更新这​​些值。

  2. 使用app.config文件并让所有其他程序集在​​初始化期间检索常量。 所以我添加了为了访问全局值而必须初始化所有内容的开销。 更灵活但也更痛苦。

  3. 使用资源。 我认为它与app.config相同。

所以,我知道有一个更好的方法来做这个常量声明。 但我不知道,到目前为止,一直无法找到如何做到这一点。 你能帮忙吗? 我有糖果!

谢谢大家

如果希望能够在运行时更改这些值,请使用app.config。

如果你希望它们在运行时被修复,那么你将不得不(并希望阻止用户搞乱它们)每次你想要改变它们时重新编译,所以使用适合你的语言的任何东西。 在C#的情况下,某种GlobalValues类/汇编。

不要将资源文件用于全局值或设置,除非您想要将值集合作为一组进行交换(例如,在编译其他语言时)。

呃,假设你的常量不是很大,你应该能够在你选择的类中将它们声明为public const

 namespace MyProject { public class Awesome { public const int SomewhatAwesome = 1; public const int ExtraAwesome = 2; /* etc */ } } 

您应该将const成员包含在与它们相关的类中,即如果SomewhatAwesomeExtraAwesome用于Awesome类,那么它们应该是在该类中声明的常量。 不要仅仅为了保持常量值创建额外的程序集,也不要为常量创建专用的静态类或命名空间,除非没有其他任何东西将常量组合在一起。

app.config文件用于最终用户在运行时可以更改的设置。 不要在该文件中放置不应更改的常量。 资源用于“大”对象,例如文本文件和图像,这些对象可能是乏味的或不可能包含为文字类成员。 不要在资源中放入简单的东西,如整数和短字符串。

您可以使用readonly关键字而不是const来避免在值更改时重新编译所有内容。

摘自MSDN:

虽然const字段是编译时常量,但readonly字段可用于运行时常量

有关详细信息,请参阅此链接 。

对于C#项目,如果你想要常量,可以说最好的办法就是在项目设置下使用Visual Studio中提供的Settings文件。 它支持自定义类型,以及AFAIK标记为可序列化的任何内容。

正如许多开发商告诉我的那样,不要重新发明轮子。 有两种设置类型,用户设置和应用程序设置,主要区别在于应用程序设置在运行时是只读的。 这基本上就是你想要的,听起来像。

看起来使用类是微软的推荐。 http://msdn.microsoft.com/en-us/library/bb397677.aspx

我认为这里的主要分歧是试图将C思维方式强加到C#项目中。 如果你有一堆常量,你只想把它们放在一个文件中,我会把它作为你需要重新思考你的设计的标志。 花些时间考虑每个常量应该属于哪个类并将其放在那里。

话虽这么说,我真的不认为你应该将这些常量与其他数据区别对待,它们应该存在于dll中。 如果“常量”发生变化,这还有一个额外的好处就是可以对dll进行版本控制。

我有一些项目,我一直在努力工作,我们决定为我们的全局价值观和function创建一个静态类:

 namespace MyNamespace { public static class MyGlobalClass { //Global stuff here } } 

这样,所有全局项始终可见,您不必实例化该类即可使用它们。

编译时常数随您居住的宇宙而变化。 因此pi和e是编译时常量。

运行时常量可能会因每个新版本而异。

设置可能会在应用程序运行的每个新时间发生变化(或者更多地取决于设置的实现方式,即数据库驱动器,配置文件驱动等)。

如果可以帮助的话,尽量避免上帝级和静态“助手”类。 您应该尽力将常量数据移动到适当的类中。

我假设您使用C#,您希望使用适当的面向对象设计,原则和模式进行开发。 请记住,对象是关于行为的 – 不一定是function。 在我看来,思维在function上导致产生程序代码。

在多个对象中使用数据时,可以使用Singleton模式。 虽然,它不一定是最佳实践。 最近,我在Unity和MEF的这些情况下开始更多地使用IoCdependency injection。