.net - .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";
}
}
解决方案
当您覆盖一个方法时,您基本上是将一个新的实现放入一个“槽” 1中,该“槽” 1 已经由您的基类指定为用于该方法。当您隐藏一个方法(不要使用覆盖)时,您正在使用您的基类使用的名称并将该名称分配给不同的“插槽”。
当编译器执行名称/重载解析时,它基本上试图决定通过哪个“槽”路由方法调用(因为由于重载,您可能有多个具有相同名称的方法,但它们会有不同的“槽” ")。
编译时Console.WriteLine
,编译器可以选择的唯一槽ToString
是为其方法Object
声明的槽。所以这是它会调用的唯一方法2。 ToString
1我在这里使用“插槽”是因为,虽然你不会发现它在 C# 规范中使用,但据我所知,在 CLR 级别,阴影方法标记为newslot
.
2不是 100% 确定它确实确实调用ToString
了自己,而不是通过任何数量的间接调用,但在这里说它确实足够了。
推荐阅读
- xml - 自动将 Wikidata URI 分配给名称列表
- java - KafkaProducer 总是为 Java API 中的模式注册表选择 localhost:8081
- r - 如何获得插值的置信区间?
- c# - 在多页 WebForms 项目中使用 VueJS
- jsp - 如何将 ArrayList 从 sevrlet 发送到 jsp 并打印出来
- batch-file - 搜索文件夹的目录
- c++ - __builtin__FUNCTION() 是否有 MSVC 等效项?
- reactjs - 如何使用带有 react native 的 react js npm 包
- powershell - 多个通配符/域的消息跟踪日志到一个 csv
- docker - Windows Docker 中的网络存储 (SMB/CIFS)