Enum是对的吗?

dou*_*leJ 2 c# enums

我正在Model使用并正在使用enum命名项目列表.

class Verse
{
    public int Number { get; set; }
    public string Text { get; set; }
}
class Chapter
{
    public int Number { get; set; }
    public List<Verse> Verses { get; set; }
}
class Book
{
    public string Name { get; set; }
    public List<Chapter> Chapters { get; set; }
}
class Bible
{
    public Versions Version { get; set; }
    public List<Book> Books { get; set; }
}

enum Versions
{
    asv1901,
    bbe,
    darby,
    kjv,
    nasb,
    niv,
    nkjv,
    nlt,
    rsv,
    web,
    ylt
}
Run Code Online (Sandbox Code Playgroud)

这似乎是一种合乎逻辑的方式,但我发现与之合作enum会增加不必要的困难.

foreach (var chapter in chapters)
{
    var bibleitem = new Bible();
    bibleitem.Version = (Versions)Enum.Parse(typeof(Versions), chapter.version);
}
Run Code Online (Sandbox Code Playgroud)

只是使用string[]或其他什么更有意义吗?我确信还有一些额外的好处enum,但我怀疑我的好处.

Eri*_*ert 7

微软的指导如下:

https://msdn.microsoft.com/en-us/library/ms229058%28v=vs.100%29.aspx?f=255&MSPPError=-2147217396

特别注意:不要对开集使用枚举

人们一直在写新的圣经,所以你的枚举值可以改变.最好使用字符串常量,例如,您可以随意添加更多字符串常量.

虽然我们对此有所了解,但对您的代码还有一些额外的批评.

class Verse
{
    public int Number { get; set; }
    public string Text { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

为什么这是一个类,为什么属性可以设置?你是否想过拥有现有的诗歌,并希望将它的数量和文字改为不同的东西?如果没有,那就不要允许了.我会写这个

struct Verse
{
    public int Number { get; private set; }
    public string Text { get; private set; }
    public Verse(int number, string text) : this() 
    {
      this.Number = number;
      this.Text = text;
    }
}
Run Code Online (Sandbox Code Playgroud)

一旦创建,它就不会改变.此外,这是一个小的不可变的东西,逻辑上是一个值,所以使它成为一个结构.

class Chapter
{
    public int Number { get; set; }
    public List<Verse> Verses { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

同样,如果你有一个现有的章节,你是否打算改变这组经文?因为任何人都可以打电话Add到列表.此外,这会限制您始终使列表可用,而不是从数据库延迟计算.做这个IEnumerable<Verse>.

enum Versions
{
  asv1901,
  bbe,
Run Code Online (Sandbox Code Playgroud)

这违反了命名准则和一般易读性.把事情拼出来! AmericanStandardVersion1901远胜于asv1901.

  • @doubleJ:一个很好的规则是:*不要让你的用户做任何你没有设计你的系统允许*的事情.如果没有理由使属性可写,请将其设置为只读.如果没有理由使列表可写,请将其设置为只读.等等.它可以在将来节省心痛. (2认同)