我有一个看似非常基本的问题。我试图确定常量字符串是否真的比使用MyEnum.ToString()调用高性能应用程序的枚举更好。
我有一个类,枚举,这样的方法......
Public Enum MyEnum
MyValue1
MyValue2
End Enum
Public Class MyImportantClass
Public Sub Foo(ByVal enumerationValue As MyEnum)
' Some code in here that needs to do this at some point
Dim str As String = enumerationValue.ToString()
End Sub
End Class
我理解enumerationValue.ToString()有一些性能问题。但是,另一个开发人员建议使用Constant Strings而不是使用Enums。我的问题是,方法参数是一个字符串,然后调用者可以传递他想要的任何东西。显然,不仅任何字符串都可以工作,所以这是一个运行时错误。
Public Sub Foo(ByVal enumerationValue As String)
' Some code in here that needs to do this at some point
' Dim str As String = enumerationValue
End Sub
我想要枚举的安全性,但是性能不变。就像我说的那样,我正在寻找一种方法来吃蛋糕并且吃它。
答案 0 :(得分:1)
Enum是目前为止的方式。有点自我记录并肯定会陷入“成功的陷阱”,因为你永远不会得到虚假的数据。
我不确定,但我怀疑.ToString()做得很好 - 不用担心。它被召唤了很多!
答案 1 :(得分:0)
好的,这可能不是您想要的,但它提供了类型安全性,并且可以防止您以后必须执行ToString
。首先设置一个具有一个没有setter的属性的类,以及一个执行该设置的New方法:
Public Class MyEnumObj
Private _Value As String
Public ReadOnly Property Value As String
Get
Return _Value
End Get
End Property
Private Sub New()
' Hide the default constructor '
End Sub
Public Sub New(inValue As String)
_Value = inValue
End Sub
End Class
然后声明你的“常数”:
Public MyValue1 As New MyEnumObj("MyValue1")
Public MyValue2 As New MyEnumObj("MyValue2")
它们不是常数但不能被修改,我认为通过正确使用Friend
你可以安排它,所以没有其他人可以创建对象。现在你可以说:
Public Sub Foo(Optional ByVal enumerationValue As MyEnumObj = Nothing)
' Some code in here that needs to do this at some point '
Dim str As String = If(enumerationValue IsNot Nothing, enumerationValue.Value, String.Empty)
End Sub
这可能有点矫枉过正,但对象确实倾向于使用它们来打字。
答案 2 :(得分:0)
坚持枚举,通过将参数作为参数传递给函数,它是更加友好的用户。 IDE可以弹出可用项列表。
要将您的枚举转换为字符串,您可以使用(Enum,String)的字典
或
有一些关于如何在枚举上放置属性的好文章,这样你就可以将它转换为字符串。
Can I give an enum an attribute in VB.NET (like I can do in Java)?
http://weblogs.asp.net/stefansedich/archive/2008/03/12/enum-with-string-values-in-c.aspx