2017-06-02 30 views
2

我正在使用Model,并使用enum获取已命名项目的列表。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 
} 

这似乎是做一个合乎逻辑的方式,但我发现,与enum工作时增加不必要的困难。

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

会更有意义只使用string[]什么?我确信enum有一些额外的好处,但我质疑我的好处。

+0

什么类型是你的'chapters'收藏? –

+0

'enum'比较'string'比较效率更高,enums用于编码的清晰度。帮助你快速理解你的代码。 – Media

+0

您可以改为使用通用['TryParse'](https://msdn.microsoft.com/en-us/library/dd783499(v = vs.110).aspx)。 '版本ver; Enum.TryParse(chapter.version,out ver); bibleitem.Version = ver;' – juharr

回答

1

如果在代码中有一个常量的命名列表,并且您知道此特定列表不会随时间变化(因此称为常量名称列表),您应该使用枚举。

你有什么好处? 可读性。使用枚举可以提高代码的可读性。考虑我有两种雇员类型的情况:永久和ContractBased。现在我可以在我的代码做到这一点是这样的:

if employee.Type == 1 
    // deal with permanent employee 
else if employee.Type == 2 
    // deal with contract based employee here 

这样的代码难以阅读和维护,因为没有人能猜出是什么employee.Type == 1或者是什么employee.Type == 2种手段。

如果我定义枚举代替这样的: 枚举EmployeeType {常驻= 1,ContractBased = 2}

我的代码变成这样:

if employee.Type == EmployeeType.Permanent 
    // deal with permanent employee 
else if employee.Type == EmployeeType.ContractBased 
    // deal with contract based employee here 

代码的可读性被最大化,并且也我有intellisense可用。

与字符串的问题: 1)你最终会在你的代码 2)没有智能感知 3)更多的内存消耗

如何应对增加的复杂性硬编码字符串文字? 你应该有一个枚举类型变量chapter.Version(现在缺少)而不是int。这样你就不需要做解析。

+0

不幸的是,chapter.version是以字符串形式出现的(JSON API结果),我想要做的是理论上,字符串结果只能匹配其中一个规定的选项,当然,这可能是我正在查看所有这些不正确的(我只是一个业余爱好者编码器)。什么看起来是正确的和t让这一切工作。 Hehehe ... – doubleJ

0
but I'm finding that working with enum is adding unnecessary difficulty. 

这取决于你的需求。如果你的集合不会改变枚举是最好的方法,因为它增加了一个更详细的控制和一个有限的集合,当你与同一个项目的许多开发人员一起工作时,这个集合是无法绕过的。

,如果你的集合可以解决方案的开发过程中改变,你不能预览设定不是字符串将是更好的方式去

0

枚举平时工作时最好:

  1. 没有一个增加或很快删除记录,它(希望永远不会)。
  2. 您不需要使用枚举记录背后的实际值。
  3. 您不需要使用记录的名称。

Enum.Parse可以用来获得从string枚举的纪录,但因为你注意到它是相当丑陋,我不鼓励你使用它。如果你有积分枚举值,你可以简单地进行投这样的:

Versions version = (Versions)0; 

但是请注意,枚举不存在保证是int型的,也可以是任何其他整数值。 int恰好是默认值。我不但是也可以从依靠枚举真实的积分值劝阻你,因为这样的事情也是可能的:

public enum Versions 
{ 
    One = 1, 
    Two = 2, 
    Three = 3 
} 

public void Do() 
{ 
    Versions version = (Version)-9; 
    // version is now Versions.One. 
    // Its value however is -9, what kind of version should -9 be? 
} 

上面的代码没有错误运行,因为运行时不会对您正在使用的值进行任何检查为演员。

的回答你的问题取决于Versions性质。如果你相信它将来不会改变,那么在大多数情况下它是一个很好的枚举类型。但是你应该在整个应用程序中使用枚举。我在您的示例中看到,您将该版本用作string,因此需要执行一个丑陋的Enum.Parse。使用枚举时,一致性是一个重要的因素,它总是如此,但是再次指出它并没有什么坏处。

如果您认为您的记录具有更多动态性质,那么您可能最适合使用string s。在这种情况下,您应该始终使用string。 (只是想指出来再次)

+0

'chapter.version'作为来自JSON API的'string'。我想我可以使用'switch'(使用数字),但这似乎增加了更多的复杂性。 – doubleJ

+0

@doubleJ如果你认为你的版本永远不会改变,你可以用'Enum.Parse'(更好地使用'Enum.TryParse')将你的json字符串映射到enum,但是一旦json进入并存储枚举实例的json字符串。但正如其他人指出的,你的'版本'可能是变化的主题,这并不适合使用枚举。 –

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; } 
} 

为什么这是一个一流的,为什么是属性设定?你是否设想过现有的诗歌,并希望将其数量和文字改为不同的东西?如果不是,那么不要允许它。我会这样写

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; 
    } 
} 

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

class Chapter 
{ 
    public int Number { get; set; } 
    public List<Verse> Verses { get; set; } 
} 

再次,如果你有一个现有的章节,你是否打算修改一组经文?因为任何人都可以在名单上拨打Add。此外,这限制你到,并且在任何时候都可以使用该列表,而不是从数据库中懒洋洋地计算出来。做这个IEnumerable<Verse>

enum Versions 
{ 
    asv1901, 
    bbe, 

这违反了命名准则和一般易读性。拼写出来! AmericanStandardVersion1901远远好于asv1901

+0

该死的 - 埃里克在这里,我的回答注定不会被人注意:P嗯,为什么你要给默认的ctor增加一个手动呼叫? –

+1

@NoelWidmer:因为在以前的C#版本中,它是必需的,现在它始终在我的手指上。 :-) –

+0

不知道! VS有这个格式化规则来自动为'this.'前缀成员访问,你也是这样做的。这有什么好处?仅仅是为了可读性,还是从旧时代的习惯。 –

0

使用枚举提供了用于比较此类实例的方法,将实例的值转换为其字符串表示形式,将数字的字符串表示形式转换为此类的实例,并创建指定枚举的实例,以及值。

正确使用im类。

Exp。

public enum Versions 
{   
    asv1901, 
    bbe, 
    darby, 
    kjv, 
    nasb, 
    niv, 
    nkjv, 
    nlt, 
    rsv, 
    web, 
    ylt 
} 

接下来,实施

foreach (var chapter in chapters) 
{ 
    var bibleitem = new Bible(); 
    bibleitem.Version = (Versions) "Your class enum"(typeof(Versions), chapter.version); 
} 

枚举多用于良好的编程习惯,干净的代码

Referency使用枚举:Enum Class Microsoft