枚举与字符串常量c#

枚举与字符串常量c#,c#,design-patterns,C#,Design Patterns,所以我最近读了一本关于依赖注入的书。在这本书的某个地方,它指出枚举是一种代码气味 我想得到SO'ers的普遍共识。我需要设计一个包含一些核心类的大型应用程序,我正在寻求设计原则方面的帮助,在这种情况下,其他人会使用这些原则,然后我会以这种或那种方式做出承诺,使得以后很难进行更改 public enum Foo { LovelyFoo, TerribleFoo } 或 使用包含contant的静态类 public static class Foo { public const s

所以我最近读了一本关于依赖注入的书。在这本书的某个地方,它指出枚举是一种代码气味

我想得到SO'ers的普遍共识。我需要设计一个包含一些核心类的大型应用程序,我正在寻求设计原则方面的帮助,在这种情况下,其他人会使用这些原则,然后我会以这种或那种方式做出承诺,使得以后很难进行更改

public enum Foo
{
  LovelyFoo,
  TerribleFoo
}

使用包含contant的静态类

public static class Foo
{
    public const string LovelyFoo = nameof(LovelyFoo); //or "Lovely Foo";
    public const string TerribleFoo = nameof(TerribleFoo); // or "Terrible Foo";
}
当然,在需要的时候使用它

Foo MyFoo = Foo.LovelyFoo;

  • 仅仅因为某些东西可以被滥用并不意味着它不好用

  • 您没有给出实际的用例,只是举了一些例子,很难说这是否有味道

  • 枚举适用于紧密绑定的集合,例如一周中的几天

    • switch语句是否有合法用途
    • 在那里,布景不会改变,而且根深蒂固
    • 其中(我知道这是循环的)枚举是有意义的
  • 让常量为常量,让枚举为枚举。但是,如果您发现自己想要使用大量的枚举和开关,那么这可能需要泛型或多态性。仅仅因为它们看起来整洁、打字、漂亮,并不意味着你的代码应该充满它们


    最后,在您的用例上运行Microsoft测试。也就是说,微软会怎么做,在BCL中,你看到过这个例子吗,它很普遍吗,微软是这样使用它们的吗。虽然这并不是一种可取的做法,但如果您发现自己编写的结构怪异而奇妙,无法预测,而且没有其他人看到过,那么您可能做错了什么

    看看这一点,了解一下枚举优于字符串的上下文。这是我第一次听说“枚举是一种代码味道”,这感觉太笼统了。你能详细解释一下这本书给出的评估理由吗?“警告:作为经验法则,枚举是代码气味,应该重构为多态类。8但是,对于这个例子,它们很好地为我们服务。”虽然确实有一些例子使用枚举(ab)而其他构造则更好,我仍然强烈反对隐含的“所有枚举都是代码气味”。它们确实有存在和被使用的理由。这本书甚至似乎自己也指出了一点:有时它只是更容易/更快。我喜欢DI,几乎在任何地方都使用它,但人们也不应该忘记雅格尼这就是说,放弃枚举而支持“常量字符串集合”至少同样“糟糕”,可能更糟。例如:如何枚举一个“集合”的所有可能字符串?对于枚举,它与
    Enum.GetValues(typeof(TheEnum)).Cast()一样“简单”
    string MyFoo = Foo.LovelyFoo;