Const Vs.方法参数的枚举

时间:2012-09-19 18:55:18

标签: c# vb.net enums const

我有一个看似非常基本的问题。我试图确定常量字符串是否真的比使用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

我想要枚举的安全性,但是性能不变。就像我说的那样,我正在寻找一种方法来吃蛋糕并且吃它。

3 个答案:

答案 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