【问题标题】:Is `Console.In` an instance of `StreamReader`?`Console.In` 是 `StreamReader` 的实例吗?
【发布时间】:2017-07-05 22:18:11
【问题描述】:

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

Console.InTextReader 的一个实例。

TextReader是一个抽象类,怎么会有Console.In的实例呢?

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

【问题讨论】:

    标签: c# standard-library


    【解决方案1】:

    试试

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

    结果是

    System.IO.TextReader+SyncTextReader
    

    所以Console.InSystem.IO.TextReader.SyncTextReader 类型,它是嵌套在TextReader 中的一个类。

    只有 property Console.In 被声明为 TextReaderSyncTextReader 显然是从它派生而来的。

    所以在继承方面,“Console.InTextReader的实例”这句话是正确的。


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

    【讨论】:

    • 您确定它不仅仅是对返回该类型的TextReader.Synchronized 的调用。在它下面确实看起来像disassembly中的StreamReader
    • @Jamiec 用装饰链更新我的答案,因为我可以追踪它
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:
      Console.WriteLine(Console.In.GetType().FullName);
      

      给我们

      System.IO.TextReader+SyncTextReader
      

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

      【讨论】:

        【解决方案4】:

        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)。
        猜你喜欢
        • 2023-03-08
        • 2013-11-15
        • 2016-11-30
        • 1970-01-01
        • 2017-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多