在几乎每个项目中,我都无法决定如何处理某些全局常量值。在过去的日子里,当我编写没有使用dll的C ++程序时,很容易。只需使用一些const
创建和.h文件,该文件描述了我的项目的某些常量值。然后我把每个文件都包括在内,并且ta-da!有效。清洁,尊重DRY原则并且很简单。
现在我的项目是C#.Net,它为我提供了大量的选项来解决这个问题。据我所知:
创建一个程序集,其唯一目的是为项目保存常量值。然后每个其他大会都应该参考这个。我尊重DRY和KISS,因为添加引用很简单。这里的主要问题是我需要重新编译整个源来更新这些值。
使用app.config文件并让所有其他程序集在初始化期间检索常量。所以我添加了为了访问全局值而必须初始化所有内容的开销。更灵活但也更痛苦。
使用资源。我认为它与app.config相同。
所以,我知道有更好的方法来做这个常量声明。但我不知道,到目前为止,一直无法找到如何做到这一点。你能帮忙吗?我有糖果!
全部谢谢
答案 0 :(得分:8)
呃,假设你的常数不是很大,你应该只能在你选择的类中将它们声明为public const
:
namespace MyProject
{
public class Awesome
{
public const int SomewhatAwesome = 1;
public const int ExtraAwesome = 2;
/* etc */
}
}
您应该将const
成员包含在与他们相关的课程中,即SomewhatAwesome
和ExtraAwesome
是否用于Awesome
课程,那么他们应该是该类中声明的常量。 不要创建一个额外的程序集只是为了保存常量值,不为你的常量创建一个专用的静态类或命名空间,除非真的没有其他任何组合常数一起。
app.config
文件用于最终用户在运行时可以更改的设置。不要在该文件中放置不应更改的常量。资源用于“大”对象,例如文本文件和图像,这些对象可能是乏味的或不可能包含为文字类成员。不要在资源中放入简单的东西,如整数和短字符串。
答案 1 :(得分:7)
答案 2 :(得分:2)
对于C#项目,如果你想要常量,可以说最好的办法就是在项目设置下使用Visual Studio中提供的Settings文件。它支持自定义类型,以及AFAIK标记为可序列化的任何内容。
正如许多开发商告诉我的那样,不要重新发明轮子。有两种设置类型,用户设置和应用程序设置,主要区别在于应用程序设置在运行时是只读的。这基本上就是你想要的,听起来像。
答案 3 :(得分:1)
看起来使用类是微软的推荐。 http://msdn.microsoft.com/en-us/library/bb397677.aspx
答案 4 :(得分:0)
如果希望能够在运行时更改这些值,请使用app.config。
如果你希望它们在运行时被修复,那么你将不得不(并且想要阻止用户搞乱它们)每次你想要改变它们时重新编译,所以使用适合你的语言的任何东西。在C#的情况下,某种GlobalValues类/汇编。
不要将资源文件用于全局值或设置,除非您想要将值集合作为一组进行交换(例如,在编译其他语言时)。
答案 5 :(得分:0)
我认为这里的主要分歧是试图将C思维方式强加到C#项目中。如果你有一堆常量只想放在一个文件中,我会把它作为你需要重新思考你的设计的标志。花些时间考虑每个常量应该属于哪个类并将其放在那里。
话虽这么说,我真的不认为你应该将这些常量与其他数据区别对待,它们应该存在于dll中。如果“常量”发生变化,这还有一个额外的好处就是可以对dll进行版本控制。
答案 6 :(得分:0)
我有一些项目,我一直在努力工作,我们决定为我们的全球价值观和功能创建一个静态类:
namespace MyNamespace
{
public static class MyGlobalClass
{
//Global stuff here
}
}
这样,所有全局项始终可见,您无需实例化该类即可使用它们。
答案 7 :(得分:0)
编译时常数随您居住的宇宙而变化。所以pi和e是编译时常量。
运行时常量可能因每个新版本而异。
设置可能会在应用程序运行的每个新时间发生变化(或者更多地取决于设置的实现方式,即数据库驱动器,配置文件驱动等)。
答案 8 :(得分:0)
如果你可以帮助它,尽量避免使用上帝课和静态'帮助'课程。您应该尽力将常量数据移动到适当的类中。
我假设您正在使用C#,您希望使用适当的面向对象设计,原则和模式进行开发。请记住,对象与行为有关 - 不一定是功能。在我看来,思维在功能上导致产生程序代码。
在许多对象中使用数据时,可以使用Singleton模式。虽然,它不一定是最佳实践。最近,我在Unity和MEF的这些情况下开始更多地使用IoC依赖注入。