StringBuilder Append和AppendLine为Enum提供不同的结果

时间:2011-02-02 20:17:39

标签: .net append stringbuilder

当使用字符串构建器时,当使用枚举作为输入时,我从append和append行函数得到预期结果,但是当枚举被加框时,追加行和追加函数会给出不同的结果。

谁能告诉我这可能背后的原因?

代码输出:

Append Enum: 1
Append Enum To String: One
Append Line Enum: 1
Append Line Enum To String: One
Append Object: One
Append Object To String: One
Append Line Object: 1
Append Line Object To String: One

代码:

Public Enum eTest
    One = 1
    Two = 2
End Enum

Sub Main()
    Dim sb As New System.Text.StringBuilder()
    Dim x = eTest.One
    sb.Append("Append Enum: ").Append(x).AppendLine()
    sb.Append("Append Enum To String: ").Append(x.ToString()).AppendLine()
    sb.Append("Append Line Enum: ").AppendLine(x)
    sb.Append("Append Line Enum To String: ").AppendLine(x.ToString())

    Dim o As Object = x
    sb.Append("Append Object: ").Append(o).AppendLine()
    sb.Append("Append Object To String: ").Append(o.ToString()).AppendLine()
    sb.Append("Append Line Object: ").AppendLine(o)
    sb.Append("Append Line Object To String: ").AppendLine(o.ToString())

    Console.WriteLine(sb.ToString())


    '===============================
    Console.ReadKey()
End Sub

1 个答案:

答案 0 :(得分:6)

这一行

sb.Append("Append Object: ").Append(o).AppendLine()

导致o.ToString()附加到StringBuilder的实例,这就是差异。当然,该调用只是传递给枚举的盒装实例,这就是为什么你看到这个调用的One

这是因为你正在调用重载StringBuilder.Append(object),它只会在传入的对象实例中调用o.ToString()。这在文档中明确说明:

  

Append方法调用Object.ToString方法来获取value的字符串表示形式。如果valuenull,则不会对StringBuilder对象进行任何更改。

另一方面,当你打电话

sb.Append("Append Enum: ").Append(x).AppendLine()

其中x是枚举的实例,x将隐式转换为int的实例,该实例将调用重载StringBuilder.Append(int)

请注意,这是特定于VB.NET的。在选择调用x的重载时,C#不会隐式地将int转换为StringBuilder.Append;它会调用StringBuilder.Append(object)