2017-02-16 8 views
-1

В .NET Framework библиотеки классов, книга говорит, чтоЯвляется ли `Console.In` экземпляром` StreamReader`?

Console.In является экземпляром TextReader.

TextReader - это абстрактный класс, так как он может иметь экземпляр Console.In?

StreamReader является производным классом TextReader и является не-абстрактным классом. Есть Console.In экземпляр StreamReader?

ответ

1

Попробуйте

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

В результате

System.IO.TextReader+SyncTextReader 

Console.In Так имеет тип System.IO.TextReader.SyncTextReader, который является классом вложенных в TextReader.

Только свойствоConsole.In объявлен как TextReader который SyncTextReader очевидно вытекает из.

Так что в плане наследования, предложение «Console.Inявляется экземпляр TextReader» является правильным.


Обновление: На самом деле (как заметил Jamiec) этот SyncTextReader имеет базовый экземпляр StreamReader. Это, в свою очередь, создается с базовым экземпляром типа __ConsoleStream.

+0

Вы уверены, что это не просто вызов TextReader.Synchronized, который возвращает этот тип. Под ним действительно выглядит «StreamReader» из [дизассемблирования] (http://www.dotnetframework.org/default.aspx/[email protected]/[email protected]/DEVDIV_TFS/Dev10/Releases/RTMRel/ndp/clr/ src/BCL/System/Console @ cs/1305376/Console @ cs) – Jamiec

+0

@Jamiec обновить мой ответ с помощью цепочки украшения, как я мог бы отслеживать его –

0

Базовый класс консоли.Мастер является SynctextReader, который является производным от TextReader.

1

TextReader является абстрактным классом, так как она может иметь экземпляр консоли.Мастер?

Вы логически правы, но его (я бы сказал) вообще понимал, что, когда вы говорите: «У меня есть экземпляр [абстрактного класса]», что вы на самом деле имеете в виду: «У меня есть экземпляр конкретного класс, который наследует абстрактный класс ». То же самое и с интерфейсами, вы можете сказать: «У меня есть экземпляр IFoo», где вы на самом деле имеете в виду «У меня есть экземпляр класса, который соответствует контракту, установленному IFoo».

Для вашего конкретного вопроса, disassembly is available И вы можете видеть, что вы в основном правы.действительный тип - это, конечно, конкретный класс, который наследует TextReader. Он использует TextReader.Synchronized вокруг экземпляра StreamReader.

.... 

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

Упрощение для более четкого объяснения формулировки. (и просто чтобы быть полным: под этим 'StreamReader' есть еще один' __ConsoleStream', 's' в вызове конструктора, который вы показываете). –

Смежные вопросы