【发布时间】:2017-07-05 22:18:11
【问题描述】:
在 .NET Framework 类库中,有一本书这样说
Console.In是TextReader的一个实例。
TextReader是一个抽象类,怎么会有Console.In的实例呢?
StreamReader是TextReader的派生类,是一个非抽象类。
Console.In 是 StreamReader 的实例吗?
【问题讨论】:
标签: c# standard-library
在 .NET Framework 类库中,有一本书这样说
Console.In是TextReader的一个实例。
TextReader是一个抽象类,怎么会有Console.In的实例呢?
StreamReader是TextReader的派生类,是一个非抽象类。
Console.In 是 StreamReader 的实例吗?
【问题讨论】:
标签: c# standard-library
试试
Console.WriteLine(Console.In.GetType());
结果是
System.IO.TextReader+SyncTextReader
所以Console.In 是System.IO.TextReader.SyncTextReader 类型,它是嵌套在TextReader 中的一个类。
只有 property Console.In 被声明为 TextReader,SyncTextReader 显然是从它派生而来的。
所以在继承方面,“Console.In是TextReader的实例”这句话是正确的。
更新:确实(正如 Jamiec 评论的那样)这个 SyncTextReader 有一个 StreamReader 的基础实例。这又是使用__ConsoleStream 类型的基础实例创建的。
【讨论】:
TextReader.Synchronized 的调用。在它下面确实看起来像disassembly中的StreamReader
Console.In 的基类是 SynctextReader,它派生自 TextReader。
【讨论】:
Console.WriteLine(Console.In.GetType().FullName);
给我们
System.IO.TextReader+SyncTextReader
SyncTextReader 是TextReader 内的嵌套类。它不是抽象的,而是内部的
见https://referencesource.microsoft.com/#mscorlib/system/io/textreader.cs,311
【讨论】:
TextReader是一个抽象类,怎么会有Console.In的实例呢?
您在逻辑上是正确的,但它(我会说)通常理解,当您说“我有一个 [抽象类] 的实例”时,您真正的意思是“我有一个继承的具体类的实例一个抽象类”。接口也是一样,你可能会说“我有一个 IFoo 的实例”,实际上你的意思是“我有一个符合 IFoo 约定的类的实例”。
对于您的具体问题,disassembly is available 您可以看到您基本上是对的。 actual 类型当然是继承TextReader 的具体类。它在StreamReader 实例周围使用TextReader.Synchronized。
....
tr = TextReader.Synchronized(new StreamReader(s, enc, false,
_DefaultConsoleBufferSize, false));
....
【讨论】:
StreamReader 下还有另一个 __ConsoleStream,在您显示的构造函数调用中的 s)。