2013-02-19 100 views
10

我正在寻找一个关于如何创建枚举类的最佳做法,而不是数字包含字符串值。 事情是这样的:类枚举类

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

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

的问题是,在上面的例子中,我应该使用变量声明:

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

会是什么设置这些类和值的最佳实践?

+2

请参阅http://stackoverflow.com/questions/3190870/const-string-vs-static-string-in-c-sharp。 – nneonneo 2013-02-19 07:01:00

回答

13

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

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

static readonly将导致正常的字段访问,所以你不会有同步问题。但是,由于额外的字段访问权限,您可能会受到轻微的性能影响(尽管除非您在性能关键的代码中使用这些字段,否则可能并不明显)。如果您认为将来必须更改字符串,则需要使用static readonly

从它的声音来看,值会变得很少,const是一个安全的赌注。然而,最终的决定取决于你。

2

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

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

+3

它太“黑客”了,它不是直截了当的,你需要做额外的投射,代码不清晰。你也可以像Enums.GetDescription((CustomerType)CustermType.Type1);但是,如果我可以用字符串CustermType.Type1String直接向前,那又有什么意义呢?无论如何,我之前不知道关于Description属性:) – 2013-02-19 13:28:08