【问题标题】:Enum-like class类枚举
【发布时间】:2013-02-03 18:51:21
【问题描述】:

我正在寻找关于如何创建类枚举类而不是数字包含字符串值的最佳实践。 像这样的:

public static class CustomerType
{
  public static string Type1 = "Customer Type 1";
  public static string Type2 = "Customer Type 2";
}

我会在整个应用程序中使用这个类作为我需要 CustomerType 的所有情况的值。我不能使用 Enum,因为这是遗留系统,并且像这样的值在任何地方都是硬编码的,我只是想将它们集中在一个地方。

问题是,在上面的例子中,我应该用它来声明一个变量吗:

  1. 静态只读关键字
  2. const 关键字
  3. 或者只是静态的

设置这些类和值的最佳做法是什么?

【问题讨论】:

标签: c# .net string constants static-members


【解决方案1】:

您应该使用普通的static,因为这些字段可能会被无意修改并导致神秘的破坏。因此,您的两个选择是static readonlyconst

const 将导致变量的值在编译时嵌入到调用代码中,这实际上等同于旧的硬编码代码(但具有符号常量的优点)。 const 的危险在于,如果 const 发生更改,您必须重新编译所有内容,以免最终出现不同步的常量和棘手的错误。

static readonly 将导致正常的字段访问,因此您不会遇到同步问题。但是,由于额外的字段访问,您可能会受到轻微的性能影响(尽管除非您在性能关键代码中大量使用这些字段,否则它可能不会引起注意)。如果您认为将来必须更改字符串,则可以使用static readonly

从它的声音来看,值的变化很少,const 是一个安全的选择。但是,最终决定权在您。

【讨论】:

    【解决方案2】:

    如果您使用 C#,为什么不创建一个枚举并设置基于 Description attributestringenum 值如下:

    public enum CustomerType
    {
        [System.ComponentModel.Description("Customer Type 1")]
        Type1,
    
        [System.ComponentModelDescription("Customer Type 2")]
        Type2
    }
    

    然后,您可以获得枚举值的Description值如下:

    int value = CustermType.Type1;
    string type1Description = Enums.GetDescription((CustomerType)value);
    

    各种其他获取枚举的Description属性值的方法,请参考这个SO QA

    【讨论】:

    • 这太“hacky”了,不直接,你需要做额外的转换,代码不清楚。你也可以像 Enums.GetDescription((CustomerType)CustermType.Type1);但是,如果我可以使用字符串 CustermType.Type1String 将其直接向前推进,那又有什么意义呢。无论如何,谢谢,我以前不知道描述属性:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多