1

当方法调用接受类型对象作为参数时,在字符串生成器上调用 ToString() 方法有什么好处吗?

StringBuilder sb = new StringBuilder("Hello");

System.Console.WriteLine(sb);

或者

System.Console.WriteLine(sb.ToString());

据我所知,WriteLine 将对象作为重载,我的猜测是在对象上调用 ToString() 方法,然后调用 StringBuilder.ToString() 方法并返回预期的字符串值。

再说一遍,显式调用 ToString() 有什么好处吗?你能证明你的答案吗?

4

4 回答 4

2

显式调用 ToString() 有什么好处吗?

Console.WriteLine(object) 将首先检查对象是否为空,如果是则简单地输出一个空行。对空对象调用 ToString 将导致 NullReferenceException。

所以 WriteLine(object) 内置了 null 安全性,null 的结果将与输出空字符串的非 null 对象相同。根据上下文,该空安全性可能很方便,也可能导致不良行为。

简而言之,如果您不想抑制 NullReferenceException,则调用 ToString() 会更有益

于 2013-08-13T21:42:09.410 回答
2

“我的猜测是然后在对象上调用 ToString() 方法”

如果您查看MSDN,您会发现没有StringBuilder直接消耗 a 的重载,因此使用了接受任何东西(object的重载。

所以你的猜测是正确的,它只会调用ToString.

如果 value 为 null,则仅写入行终止符。否则,将调用 value 的 ToString方法以生成其字符串表示形式,并将生成的字符串写入标准输出流。

然后我更愿意自己调用它,因为它更具可读性,并且通过传递StringBuilder.

于 2013-08-13T21:22:24.283 回答
2

唯一的好处是你在做什么很清楚。如果您可以明确说明某些事情,那么它会使代码更具可读性。

于 2013-08-13T21:16:16.000 回答
0

不,没有任何好处。像 ReSharper 这样具有良好静态分析功能的工具实际上会让您知道调用是多余的,可以安全地删除。

于 2013-08-13T21:11:09.557 回答