C# 使用全局常量的正确方法
在几乎每个项目中,我都无法决定如何处理某些全局常量值。在旧时代,当我编写C++程序时,没有使用DLL,这是很容易的。只需创建和.h文件,其中包含大量的C# 使用全局常量的正确方法,c#,.net,resources,app-config,C#,.net,Resources,App Config,在几乎每个项目中,我都无法决定如何处理某些全局常量值。在旧时代,当我编写C++程序时,没有使用DLL,这是很容易的。只需创建和.h文件,其中包含大量的const,用于描述我的项目的某些常量值。然后我把每一份文件都包括进去了,然后呢!成功了。干净,尊重干燥原则,简单 现在我的项目是C#.Net,它为我提供了大量的选项来处理这个问题。据我所知: 创建一个程序集,其唯一目的是为我的项目保存常量值。然后,每个其他程序集都应引用此程序集。我尊重DRY和KISS,因为添加引用非常简单。这里的主要问题是我需要
const
,用于描述我的项目的某些常量值。然后我把每一份文件都包括进去了,然后呢!成功了。干净,尊重干燥原则,简单
现在我的项目是C#.Net,它为我提供了大量的选项来处理这个问题。据我所知:
正如许多开发人员告诉我的,不要重新发明轮子。有两种设置类型,用户设置和应用程序设置,主要区别在于应用程序设置在运行时是只读的。这基本上就是您想要的,听起来像。您可以使用
readonly
关键字,而不是const
,以避免在值更改时重新编译所有内容
摘自MSDN:
而const字段是编译时
常量,则只读字段可以为
用于运行时常量
有关更多详细信息,请参见此。呃,假设您的常量不是很大,您应该能够在您选择的类中将它们声明为
公共常量
:
namespace MyProject
{
public class Awesome
{
public const int SomewhatAwesome = 1;
public const int ExtraAwesome = 2;
/* etc */
}
}
您应该将您的const
成员包括在它们相关的类中,即如果SomewhatAwesome
和ExtraAwesome
用于Awesome
类,并且被Awesome
类使用,那么它们应该是该类中声明的常量。不要仅仅为了保存常量值而创建一个额外的程序集,也不要为常量创建一个专用的静态类或命名空间,除非没有其他东西可以将常量组合在一起
app.config
文件用于最终用户在运行时可以更改的设置。不要将不应更改的常量放在该文件中。资源用于“大”对象,如文本文件和图像,这些对象很繁琐或不可能包含为文本类成员。不要在参考资料中放置简单的东西,如整数和短字符串。看起来使用类是微软的建议 如果希望值能够在运行时更改,请使用app.config
如果您希望在运行时修复它们,那么每次您想要更改它们时,您都必须(并且想要,阻止用户乱动它们)重新编译,所以请使用适合您的语言的任何东西。在C#的情况下,某种全局值类/集合
不要将资源文件用于全局值或设置,除非您希望将一组值作为一个组进行交换(例如,在为另一种语言编译时)。我认为这里的主要分歧是试图将C的思维方式强制应用到C项目中。如果你有一堆常数,你只想把它们放在一个文件中,我会把它作为一个信号,你需要重新思考你的设计。花些时间思考每个常数真正应该属于哪个类,并将其放在那里
也就是说,我真的不认为应该将这些常量与其他数据区别对待,它们应该存在于dll中。这还有一个额外的好处,即如果“常量”发生更改,可以对dll进行版本设置 我有几个项目一直在工作,我们决定为我们的全局值和函数创建一个静态类:
namespace MyNamespace
{
public static class MyGlobalClass
{
//Global stuff here
}
}
这样,所有全局项都是可见的,您不必实例化类就可以使用它们。编译时常量随您所在的宇宙而变化。所以pi和e是编译时常数 运行时常量可能随每个新版本而变化
每次运行应用程序时,设置可能会发生变化(或者更频繁地变化,具体取决于设置的实现方式,如db驱动器、配置文件驱动等)。如果可以,请尽量避免使用God类和静态“helper”类。您应该尽最大努力将常量数据移动到适当的类中 我假设,由于您使用的是C语言,您希望使用适当的面向对象设计、原则和模式进行开发。记住,对象是关于行为的——不一定是功能性的。在我看来,功能性思维导致产生过程性代码
当数据在许多对象中使用时,可以使用单例模式。尽管如此,这不一定是最佳实践。最近,我开始在Unity和MEF的这些情况下更多地使用IoC依赖注入。我所说的常量将被解决方案中的许多对象使用。还可以吗?@Bruno,是的,你只需要找到放它们的合乎逻辑的地方。通常,如果您主要将常量作为参数传递给
Foo
,那么常量应该是Foo
的成员