繁体   English   中英

隐式和显式 StringBuilder.ToString() 方法调用之间有什么区别?

[英]What is the difference between implicit and explicit StringBuilder.ToString() method calls?

我刚刚编写了一个小型单元测试,其中使用了StringBuilder()

var stringBuilder = new StringBuilder();
stringBuilder.Append("Foo");

Assert.AreEqual(stringBuilder, "Foo");

此测试将失败。

Expected: <Foo>
But was:  "Foo"

但是,如果我将 Assert 更改为

Assert.AreEqual(stringBuilder.ToString(), "Foo");

测试将通过。

那么, ToString()方法的隐式调用和显式调用有什么区别呢? 或者/这些括号( <> )代表什么?

在您的第一个示例中,您正在测试StringBuilder实例是否等于字符串,这将失败。

在您的第二个中,您正在测试调用ToString() (它是一个字符串)的结果是否等于另一个字符串。


括号 (<>) 是 NUnit 的方式,用于指示它获得了一个非字符串对象,但为了显示消息,NUnit 对该对象调用ToString()

Expected: <Foo> But was: "Foo"

所以<Foo>是一个在调用ToString()返回Foo的对象,而"Foo"只是一个String Foo

MSTest 会向您显示不同的消息,这会更清楚:

Expected:<Foo (System.Text.StringBuilder)>. Actual:<Foo (System.String)>.   

在第一个版本中,没有对 ToString 的隐式调用这只会发生在像 Console.WriteLine 这样的方法中。

因此,实际发生的是您将 stringbuilder 对象等同于 string 对象。 即使类型不匹配:-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM