2014-12-23 3 views
1

Я прочитал в исходном коде .net более конкретно, это источник mscorlib, и я остановился, чтобы посмотреть, как был реализован класс Stream, все как прекрасно, и все до тех пор, пока я не увидел эту строку Код:mscorlib Исходный поток должен вызывать StackOverflowException

public static readonly Stream Null = new NullStream(); 

А потом я thougth «Так NullStream выводится из потока ждать следует, что не сгенерирует исключение?».

Это то, что прошли мой взгляд: codeflow и вот sourcecode путь к потоку является:

Проект-> mscorlib Path => система/Io/stream.cs

+1

Почему 'StackOverflowException'? 'Null' объявляется внутри' Stream' как 'static' (создается один единственный экземпляр), и это даже не вызов ... –

+0

Если он не был статическим: обязательно. Но это так ... Нет –

ответ

1

StackOverflowException, как ожидается, с этим кодом:

public readonly Stream Null=new NullStream() 

, потому что вызов NullStream конструктор будет вызывать поток гр onstructor (родительский класс), который должен инициализировать поле Null, которое затем вызывает NullStream() ....
, но эй статично! инициализация статических полей выполняется только один раз и до создания любого объекта, вызов NullStream() вызовет Stream(), но последний не будет инициализировать Null, поскольку конструкторы не инициализируют статические поля (кроме статических конструкторов, которые у нас отсутствуют Вот).
, даже если у нас был статический конструктор, он вызывается только один раз и до создания любого объекта.

+0

Пропустил это, спасибо =) – Patrick

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