Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用全局常量的正确方法_C#_.net_Resources_App Config - Fatal编程技术网

C# 使用全局常量的正确方法

C# 使用全局常量的正确方法,c#,.net,resources,app-config,C#,.net,Resources,App Config,在几乎每个项目中,我都无法决定如何处理某些全局常量值。在旧时代,当我编写C++程序时,没有使用DLL,这是很容易的。只需创建和.h文件,其中包含大量的const,用于描述我的项目的某些常量值。然后我把每一份文件都包括进去了,然后呢!成功了。干净,尊重干燥原则,简单 现在我的项目是C#.Net,它为我提供了大量的选项来处理这个问题。据我所知: 创建一个程序集,其唯一目的是为我的项目保存常量值。然后,每个其他程序集都应引用此程序集。我尊重DRY和KISS,因为添加引用非常简单。这里的主要问题是我需要

在几乎每个项目中,我都无法决定如何处理某些全局常量值。在旧时代,当我编写C++程序时,没有使用DLL,这是很容易的。只需创建和.h文件,其中包含大量的
const
,用于描述我的项目的某些常量值。然后我把每一份文件都包括进去了,然后呢!成功了。干净,尊重干燥原则,简单

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

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

  • 使用app.config文件,并让所有其他程序集在初始化过程中检索常量。因此,我增加了必须初始化所有内容才能访问全局值的开销。更灵活,但也更痛苦

  • 使用资源。我认为这与app.config相同

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

    感谢所有的C#项目,如果您想要常数,可以说最好的方法是在项目设置下使用Visual Studio中提供的设置文件。它支持自定义类型,并支持标记为可序列化的任何内容


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

    您可以使用
    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
    的成员