`Console.In`是`StreamReader`的一个实例吗?

时间:2017-02-16 16:53:39

标签: c# standard-library

在.NET Framework类库中,有一本书说

  

Console.InTextReader的实例。

TextReader是一个抽象类,那么如何才能有一个实例Console.In

StreamReaderTextReader的派生类,是一个非抽象类。 Console.InStreamReader的实例吗?

4 个答案:

答案 0 :(得分:1)

尝试

Console.WriteLine(Console.In.GetType());

结果是

System.IO.TextReader+SyncTextReader

所以Console.In的类型为System.IO.TextReader.SyncTextReader,这是一个嵌套在TextReader中的类。

只有属性 Console.In被声明为TextReader SyncTextReader显然来自。{/ p>

因此,在继承方面,句子" Console.In TextReader"的一个实例。是对的。

更新:确实(正如Jamiec评论的那样)这个SyncTextReader有一个StreamReader的基础实例。反过来,这是使用类型__ConsoleStream的基础实例创建的。

答案 1 :(得分:1)

  

TextReader是一个抽象类,那么如何才能有一个实例Console.In?

你在逻辑上是正确的,但它(我会说)一般都明白,当你说"我有一个[抽象类]的实例"你真正的意思是"我有一个具体类的实例,它继承了一个抽象类"。它与接口相同,你可能会说"我有一个IFoo实例"你的实际意思是"我有一个类的实例,它符合IFoo"所规定的合同。

针对您的具体问题,disassembly is available您可以看到您基本上是对的。 实际类型当然是继承TextReader的具体类。它在TextReader.Synchronized个实例周围使用StreamReader

....

tr = TextReader.Synchronized(new StreamReader(s, enc, false, 
                                              _DefaultConsoleBufferSize, false));
....

答案 2 :(得分:0)

Console.In 的基类是 SynctextReader ,它派生自TextReader。

答案 3 :(得分:0)

Console.WriteLine(Console.In.GetType().FullName);

给我们

System.IO.TextReader+SyncTextReader

SyncTextReaderTextReader内的嵌套类。它不是抽象的,而是内部的 见https://referencesource.microsoft.com/#mscorlib/system/io/textreader.cs,311