У меня есть Jetbrains dotpeek, установленный на моей машине, который я использую, чтобы заглянуть в путь .net типов. Большинство типов обычно находятся под файлами mscorlib.dll, system.dll и несколькими другими DLL. Я пытаюсь найти, как ключевые слова делегата и события определены в .net BCL, но я не могу найти его внутри любой DLL. Я также не могу найти какую-либо онлайн-документацию, которая показывает, где она определена. Может ли кто-нибудь сказать мне, где определено определение делегата и ключевое слово события?Где задано ключевое слово делегат и событие?
ответ
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
: если вы его используете, компилятор испускает класс, соответствующий указанным выше критериям.
В парсере (языковая грамматика) конечно ... – leppie
'delegate' и' event' являются ключевыми словами на языке, а не типах. Они используются для типов _declare_, которые являются делегатами и событиями. Таким образом, вы не найдете их в BCL. Вы найдете их в справочной системе. – Oded
Справедливости ради стоит сказать, что CLR не нужно ссылаться на любую DLL, чтобы знать, что такое делегат? И что определение делегата/события находится в DLL CLR? – Foo