为何C#中Console.WriteLine(实例)与实例.ToString()输出结果一致?
为什么
Console.WriteLine(inst1.ToString())和Console.WriteLine(inst1)输出结果一致? 问题背景
我在浏览C#程序时发现一个类的特殊行为,于是写了这段测试代码验证:
class Program { static void Main() { Test inst1 = new Test(); inst1.name0 = "Hello"; inst1.name1 = "World"; Console.WriteLine(inst1.ToString()); Console.WriteLine(inst1); } } class Test { public string name0; public string name1; public override string ToString() { return string.Format("Name0: {0}; Name1: {1}", name0 ?? "(null)", name1 ?? "(null)"); } }
输出结果:
Name0: Hello; Name1: World Name0: Hello; Name1: World
想知道为什么这两种调用方式的输出完全相同?
解答
这其实是Console.WriteLine的设计逻辑决定的,本质上两种写法做的是同一件事:
- 当你调用
Console.WriteLine(inst1.ToString())时,是主动触发了你在Test类里重写的ToString()方法,直接把自定义的字符串传给WriteLine输出。 - 而调用
Console.WriteLine(inst1)时,你传入的是Test类型的对象实例。这时Console.WriteLine的object参数重载会自动调用该对象的ToString()方法——因为所有C#对象都继承自object类,而你已经在Test里重写了这个方法,所以它会使用你自定义的逻辑生成字符串,而不是object类默认的输出类型全名的逻辑。
简单说,Console.WriteLine(object)内部就是在调用参数的ToString(),所以两种写法最终都会走到你重写的那个方法里,输出自然完全一致。
要是你没重写ToString(),两种写法都会输出类似YourNamespace.Test的类型全名,这也能反过来验证这个逻辑。
内容的提问来源于stack exchange,提问作者Oleksandr Zymohliad
相关产品推荐
相关产品推荐

