4

Я хотел бы знать, как компилятор C# и .Net может успешно скомпилировать классы или классы с привязкой по ссылке, связанные с классами, в одной и той же сборке.C# - Как классы саморегуляции или классы круговой ссылки в одной и той же сборке успешно скомпилированы

Рассмотрите следующий код, присутствующий в той же сборке.

class X{ X x; } 
class Y{ Z z; } 
class Z{ Y y; } 

Конечно, этот код успешно компилируется.
Но как? Я хотел бы знать, как компилятор может разрешить классы в этих случаях в первый раз.
Например, когда компилятор встречает класс Y, он еще не знает класс Z. Как он может разрешить дочернее свойство z ​​в классе Y?
Пожалуйста, объясните, что именно происходит в фоновом режиме при компиляции кода. Возможно, некоторые подходящие статьи о том, как компилятор решает классы и типы

+0

Что, в точности, вы считаете препятствием для составления такого кода? –

+0

Ах. Я должен был добавить это в вопрос. –

+2

[Сколько проходов] (https://blogs.msdn.microsoft.com/ericlippert/2010/02/04/how-many-passes/), вероятно, это сообщение, которое вам нужно прочитать, где Эрик Липперт описывает, как C# компилятор работает, что не похоже на компилятор C, который должен иметь всю доступную информацию, когда он делает один проход над исходным файлом. –

ответ

0

Как уже упоминалось в this статье, C# компилятор выполняет «Two Pass» т.е.

  1. В первом проходе он вычисляет метаданные: «Верхний уровень» вещи , как пространства имен, классы, структуры, перечисления, интерфейсы, делегаты, методы, параметры типа, формальные параметры, конструкторы, события, атрибуты и т. д.

  2. Второй проход вычисляет IL: код, который поступает в тела метода, тела конструктора и т. Д.

C# компиляции подход отличается от C/C++, где класс, метод, макросы и т.д. объявлены в заголовочных файлах, которые помогают ему получить всю информацию о классе, методы и т.д. в одном проходе, просто читая файлы заголовки. По сравнению с C# у него нет файлов заголовков, вместо этого он использует метод Two Pass для компиляции всего кода.