我正在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,但我怀疑我的好处.
微软的指导如下:
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.