首页 > 解决方案 > .NET Console.WriteLine 方法 ToString 行为

问题描述

据我所知.NET Console.WriteLine 方法调用类的 ToString 方法。在下面的代码中, Console.WriteLine(object) 调用和 Console.WriteLine(object.ToString()) 调用产生不同的输出。如果在下面的代码中将 override 关键字添加到 ToString 方法,则输出将变得相同。但我想知道为什么在第一种情况下输出不同。

程序输出:

TestOverrideConsole.Program(类名)

来自节目的你好

class Program
{
    static void Main(string[] args)
    {
        Program p = new Program();
        Console.WriteLine(p);
        Console.WriteLine(p.ToString());

        Console.ReadLine();
    }

    public String ToString()
    {
        return "Hello from Program";
    }
}

标签: .nettostring

解决方案


当您覆盖一个方法时,您基本上是将一个新的实现放入一个“槽” 1中,该“槽” 1 已经由您的基类指定为用于该方法。当您隐藏一个方法(不要使用覆盖)时,您正在使用您的基类使用的名称并将该名称分配给不同的“插槽”。

当编译器执行名称/重载解析时,它基本上试图决定通过哪个“槽”路由方法调用(因为由于重载,您可能有多个具有相同名称的方法,但它们会有不同的“槽” ")。

编译时Console.WriteLine,编译器可以选择的唯一槽ToString为其方法Object声明的槽。所以这是它会调用的唯一方法2 ToString


1我在这里使用“插槽”是因为,虽然你不会发现它在 C# 规范中使用,但据我所知,在 CLR 级别,阴影方法标记为newslot.

2不是 100% 确定它确实确实调用ToString了自己,而不是通过任何数量的间接调用,但在这里说它确实足够了。


推荐阅读