2013-09-08 3 views
0

У меня есть Jetbrains dotpeek, установленный на моей машине, который я использую, чтобы заглянуть в путь .net типов. Большинство типов обычно находятся под файлами mscorlib.dll, system.dll и несколькими другими DLL. Я пытаюсь найти, как ключевые слова делегата и события определены в .net BCL, но я не могу найти его внутри любой DLL. Я также не могу найти какую-либо онлайн-документацию, которая показывает, где она определена. Может ли кто-нибудь сказать мне, где определено определение делегата и ключевое слово события?Где задано ключевое слово делегат и событие?

+0

В парсере (языковая грамматика) конечно ... – leppie

+2

'delegate' и' event' являются ключевыми словами на языке, а не типах. Они используются для типов _declare_, которые являются делегатами и событиями. Таким образом, вы не найдете их в BCL. Вы найдете их в справочной системе. – Oded

+0

Справедливости ради стоит сказать, что CLR не нужно ссылаться на любую DLL, чтобы знать, что такое делегат? И что определение делегата/события находится в DLL CLR? – Foo

ответ

1

I Этот вопрос показывает, что вы не понимаете отношений между C#, .Net, IL и CLR. Я бы посоветовал вам сначала прочитать об этом.

Все ключевые слова языка C# таковы: ключевые слова языка. Они не имеют никакого представления ни в каких DLL или в CLR (по крайней мере, не напрямую). Только компилятор C# заботится о ключевых словах C#, и они влияют на то, что IL производит.

Если вы декомпилировать библиотеки DLL, вы можете увидеть код для типов и поскольку delegate и event ключевых слов не представляют типов (как, например, int, decimal или string делать), вы не собираетесь, чтобы найти их в любая DLL.

Если вы хотите узнать подробности об ИЛ, посмотрите на ECMA 335, что является его спецификацией.

Если вы посмотрите там, вы обнаружите, что в IL событие - это всего лишь совокупность двух (или более) методов (§II.18), и именно это компилирует ключевое слово C# event.

Так что, если вы пишете код, как:

public event EventHandler SomeEvent 
{ 
    add { /* some code */ } 
    remove { /* more code */ } 
} 

Тогда C# компилятор генерирует два метода и событие, которое состоит из этих методов. Если вы не пишете код для add и remove самостоятельно (это обычный случай, и он называется «полеподобным событием»), тогда компилятор C# генерирует его для вас вместе с фоновым полем (и кодом is not that simple) ,

Ключевое слово delegate ведет себя интересным способом. Согласно спецификации IL (§I.8.9.3), делегат является специальным классом, который получен из System.Delegate и имеет метод под названием Invoke. Код для этого метода предоставляется CLR, поэтому вы не увидите ничего там, если вы декомпилируете некоторый тип делегата. И это именно то, что делает ключевое слово C# delegate: если вы его используете, компилятор испускает класс, соответствующий указанным выше критериям.