2

我有一个看似非常基本的问题。我正在尝试确定常量字符串是否真的比使用 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() 存在一些性能问题。但是,另一位开发人员建议不要使用枚举,而是使用常量字符串。我的问题是方法参数是一个字符串,然后调用者可以传递他想要的任何东西。显然,不是任何字符串都可以工作,所以这是一个运行时错误。

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

我想要枚举的安全性,但性能却是常数。正如我所说,我正在寻找一种方法来拥有我的蛋糕并吃掉它。

4

3 回答 3

1

到目前为止,枚举是要走的路。有点自我记录,肯定会掉进“成功的坑”,因为你永远不会得到虚假数据。

我不确定,但我怀疑 .ToString() 做的很好——不用担心。它被称为很多!

于 2012-09-19T18:59:56.643 回答
0

好的,这可能不是您想要的,但它提供了类型安全并防止您ToString稍后再做。首先设置一个具有一个没有设置器的属性的类,以及一个执行设置的 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

这可能有点矫枉过正,但对象确实倾向于使自己具有类型安全性。

于 2012-09-19T19:57:04.683 回答
0

坚持使用枚举,将其作为参数传递给函数会更加用户友好。IDE 可以弹出可用项目的列表。

要将您的枚举转换为字符串,您可以使用 (Enum, String) 的字典

或者

有一些关于如何将属性放在枚举上的不错的文章,这样您就可以将其转换为字符串。

我可以在 VB.NET 中给枚举一个属性(就像我在 Java 中可以做的那样)?

http://weblogs.asp.net/stefansedich/archive/2008/03/12/enum-with-string-values-in-c.aspx

于 2012-09-20T15:08:50.763 回答