C#值类型调用ToString方法疑问:为何返回值而非类型名?
问题解答
先看你给出的代码:
One hh = new(); Console.WriteLine(hh.ToString()); Int32 ww = 77; Console.WriteLine(ww.ToString()); Console.WriteLine(5.ToString());
你提到未重写ToString的One类调用方法返回类名,这是因为Object类的默认ToString实现就是返回当前类型的名称。而Int32(也就是C#里的int)之所以返回数值本身,核心原因是:
Int32已经重写了Object类的ToString方法,它的重写版本会返回自身数值的字符串表示,而不是类型名称。
关于你疑惑的装箱问题:
- 值类型调用自身的实例方法时,.NET Runtime会做优化,不需要装箱就能直接调用。比如
ww.ToString()或者5.ToString(),都是直接在值类型实例上调用重写后的方法,不会触发装箱操作。 - 就算真的发生了装箱(比如把int转成Object后调用ToString),因为多态的特性,调用的依然是
Int32重写的版本,还是会返回数值字符串,而不是Object的默认类型名称。
简单来说,就是Int32自己重新实现了ToString方法,所以行为和你自定义的未重写该方法的One类不一样。
内容的提问来源于stack exchange,提问作者Jason9789
相关产品推荐
相关产品推荐

