在处理Enum类型时,CStr()与.ToString进行比较

时间:2012-12-23 17:51:26

标签: vb.net

我(显然不正确)认为Cstr(something)相当于something.ToString 我希望得到一个枚举类型作为字符串,它似乎取决于我使用的转换方法我得到enum的索引或名称:

Public Enum vehicleType
    Car
    Lorry
    Bicycle
End Enum

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        MsgBox("Index is " & _
               CStr(vehicleType.Car) & _
               ".Name is " & _
               vehicleType.Car.ToString)
    End Sub
End Class

为什么这些转换为字符串返回enum类型的不同元素?

2 个答案:

答案 0 :(得分:5)

ToString方法是返回String的标准公共方法。它是一种由基础Object类型定义为可重写的方法。因此,每个类都可以覆盖该方法以返回它想要的任何内容。类重写ToString方法以使其返回对象的良好的人类可读描述是很常见的。

另一方面,

CStr是一个铸造操作员。它是CType(x, String)的简写。像许多其他运算符一样,转换运算符可以被任何类重写。但是,通常情况下,您希望转换操作返回原始对象的实际值的最接近表示,而不是描述性字符串。

然后,您可能希望ToString返回与CStr不同的结果。对于枚举,每个成员本质上都是一个整数,因此枚举成员上的CStr与整数上的CStr的作用相同。这就是你所期望的。但是,已覆盖ToString以返回值更人性化的版本。这也是你所期望的。

以下是覆盖CStrToString的类的示例:

Public Class MyClass
    Public Overrides Function ToString()
        Return "Result from ToString"
    End Function

    Public Shared Widening Operator CType(ByVal p1 As MyClass) As String
        Return "Result from cast to String"
    End Operator
End Class

答案 1 :(得分:1)

这个MSDN Library article详细解释了CStr()接受的表达式。总结:

  • 生成布尔值的表达式,转换为“True”或“False”
  • 生成DateTime的表达式,转换为短日期时间格式
  • 生成数字类型的表达式,转换为表示数字的字符串。

请注意,它没有枚举类型的项目符号。编译器总是乐于将枚举值转换为整数。所以第3个子弹适用,这就是你得到“0”的原因。