2014-02-11 243 views
1

我发现一些新的风格(对我来说)“定义”选择查询的输出。性能枚举vs类?

Private Enum Item 
    ID 
    Item 
    Description 
End Enum 


    Private Class Item 
    Private ID as String 
    Private Item as String 
    Private Desc as String 
    End Class 

我正在考虑使用其中之一。通过使用类我不需要在显示之前重新投射元素类型。但Enum似乎更容易理解。

任何人有一些建议如何决定?

+1

苹果和橘子。作为一个枚举,Item.ID将只是一个整数。如果你想要一个字符串,然后使用一个类,但这些成员可能应该是属性(和“朋友”,除非课堂以外的任何东西不能读取或写入他们) – Plutonix

回答

1

从你的问题,你真正的意思是结构VS级。我会默认创建一个类。使用结构与类的主要原因是当你需要值语义时 - 赋值/参数复制比特,而不是指针。这在我的经验中相当罕见。除非你有一个令人信服的理由(并且你知道其中的不同),否则请上课。

+0

好点,我错过了他可能意味着结构,而不是枚举 – Plutonix

2

枚举成员是数字(通常是整数,但可以很长)。但它们不是可变的,并且在运行时不会改变。所以你的枚举等于:

Private Enum Item 
    ID = 0 
    Item = 1 
    Description = 2 
End Enum 

如果你想描述是一个字符串,那么类是一个更好的主意。枚举被用来引用或索引某些东西或限制/定义一个选择。像:

Public Property Stooge As Stooges 

Friend Enum Stooges 
    Larry 
    Moe 
    Curly 
    Shemp 
    CurlyJoe 
End Enum 

Stooge属性必须是其中的一个值。在代码中它会显示文本(“moe”),但存储和整数(1)。用户将被显示在下拉列表等文本


可以用枚举常量的描述联系起来:

Public Enum Stooges 
    <Description("Larry - Funny one")> Larry 
    <Description("Moe - 'Smart' One")> Moe 
    <Description("Curly - Sore One")> Curly 
    <Description("Shemp - One with bad haircut")> Shemp 
    <Description("CurlyJoe - Last one")> CurlyJoe 
End Enum 

要获得描述为一个单一的一个:

Public Shared Function GetDescription(ByVal EnumConstant As [Enum]) As String 
    Dim fi As Reflection.FieldInfo = 
       EnumConstant.GetType().GetField(EnumConstant.ToString()) 

    Dim attr() As DescriptionAttribute = 
      DirectCast(fi.GetCustomAttributes(GetType(DescriptionAttribute), 
      False), DescriptionAttribute()) 

    If attr.Length > 0 Then 
     Return attr(0).Description 
    Else 
     Return EnumConstant.ToString() ' return enum name if no Descr 
    End If 
End Function 

用法:str = enumHelper.GetDescription(Stooge.Moe)(enumHelper是静态/共享函数驻留的calss的名称)。

要得到所有的描述的字符串数组:

Public Shared Function GetDescriptions(ByVal type As Type) As String() 
    Dim n As Integer = 0 
    Dim enumValues As Array 

    Try 
     enumValues = [Enum].GetValues(type) 
     Dim Descr(enumValues.Length - 1) As String 

     For Each value As [Enum] In enumValues 
      Descr(n) = GetDescription(value) 
      n += 1 
     Next 
     Return Descr 

    Catch ex As Exception 
     MessageBox.Show(ex.Message) 
     Return Nothing 
    End Try 

End Function 

用法:Dim strEnum As String() = enumHelper.GetDescriptions(GetType(Stooges))