使用Globals Constants的正确方法

时间:2010-06-22 15:39:28

标签: c# .net resources app-config

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

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

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

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

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

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

    全部谢谢

9 个答案:

答案 0 :(得分:8)

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

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

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

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

答案 1 :(得分:7)

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

摘自MSDN:

  

虽然const字段是编译时   常数,只读字段可以   用于运行时常量

有关详细信息,请参阅此link

答案 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依赖注入。