You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:32:39