繁体   English   中英

C# 常量管理最佳实践

[英]C# Constants Management Best Practices

我是一名 22 岁的开发人员,几天前我寻找在项目中存储和管理常量的最佳实践。 我在 StackOverflow 上发现一个人说你必须创建一个 static class 和 static 方法来返回常量值,这样你就可以轻松找到所有常量的文件来更改里面的常量...但我在想“如果我希望能够切换到调试常量或释放常量而无需在我的代码中编写太多检查并具有强一致性,我该如何根据这种'最佳实践'来实现它?” 所以我写了这个,它有效,但我想从更多的专家 dotnet 和 C# 开发人员那里知道这是否是一个好方法:

public abstract class ConstantsBase 
{
    public static ConstantsBase Instance {get; set;}
    protected ConstantsBase() {}

    public abstract string GetSomeValue();
}

public class ConstantsA : ConstantsBase
{
    public override string GetSomeValue()
    {
        return "SomeValue";
    }
}

public class ConstantsB : ConstantsBase
{
    public override string GetSomeValue()
    {
        return "SomeOtherValue";
    }
}

public class Program 
{
    public static void Main()
    {
        #if DEBUG
        ConstantsBase.Instance = new ConstantsA();
        #elif RELEASE
        ConstantsBase.Instance = new ConstantsB();
        #endif

        Console.WriteLine(ConstantsBase.Instance.GetSomeValue());
    }
}

我将它设计为 singleton,因此可以从程序内部的任何位置调用它,而无需多次实例化。

这里有一些改进你的基本想法的建议,这很聪明!

  1. 如果您的常量可以根据环境更改,您可能希望使它们成为应用程序设置而不是常量,但是,我还注意到,应用程序设置通常也依赖于常量,因为它们的键,它们自己!

  2. 继续这个想法:如果您有很多设置,并且它们因环境而异,您可能想要进行设置 class 注入应用程序,而不是常量文件。 你如何填充它可能会有所不同。

  3. 但如果常量真的是最合适的,我会稍微修改类,以避免甚至有单例。 您可以使用与编译器指令相同的想法,使用 static 类:

    因此,一个名为ConstantsDebug.cs的文件:

     // Don't call it "ConstantsDebug": call it just "Constants", but // wrap _the whole thing_ in a `#if... #endif` #if DEBUG public static partial class Constants { public const string SomeValue = "SomeValue"; } #endif

    ... 和ConstantsRelease.cs一样:

     #if RELEASE public static partial class Constants { public const string SomeValue = "SomeOtherValue"; } #endif
  4. 如果您最终使用大量环境和大量常量(或大量应用程序设置键),您可能希望使用 T4 文件,从主列表中读取,来生成代码。

  5. 如果您的常量始终属于类别,则您可能希望对文件进行更多的专业化。 例如,如果您使用特征标记,并且为标记名称提供常量,则可以在单独的代码文件中拥有一个子类,该子类(逻辑上)在常量 class 内:

     public static partial class Constants { public static partial class FeatureFlags { public const string FeatureFlagOne = "FeatureFlagNameOne"; } }

然后可以通过引用Constants.FeatureFlags.FeatureFlagOne来调用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM