Использует ли ASP.NET отражение для проверки существования обработчиков событий? - PullRequest
2 голосов
/ 13 декабря 2011

Я создаю страницу asp.net, например default.aspx.

Затем я определяю кнопку ...

<asp:Button ID="btnNew" runat="server" Text="New" OnClick="btnNew_OnClick" /> 

... однако я не определяю обработчик для btnNew_OnClick в коде.

ASP.Net сообщит мне об этом при запуске страницы и выдаст исключение.

Следовательно, использует ли она отражение, чтобы проверить, имеет ли класс, реализующий мою страницу, этот метод?

Это эффективно, если он должен делать это каждый раз, когда анализирует разметку страницы?

Ответы [ 3 ]

2 голосов
/ 13 декабря 2011

Не специально. Это происходит, когда ASP.NET компилирует разметку ASPX . Разметка ASPX компилируется при первом обращении к странице на лету и сохраняется где-то в C:\WINDOWS\Microsoft.NET\Framework\vX\Temporary ASP.NET Files.

Исключением является случай, когда вы прекомпилируете свои страницы, используя aspnet_compiler.exe. Однако, если бы вы его предварительно скомпилировали, вы бы увидели там ошибку, а не когда зашли на сайт.

Эффективно ли это, если он должен делать это каждый раз, когда анализирует разметку страницы?

ASP.NET не анализирует разметку при каждом просмотре страницы и отправляет обратно; он анализируется только один раз, когда он компилируется. Он хранит хэш страницы (обычно называемый hash.web где-то во временных файлах ASP.NET) и сравнивает хэши. Если хеш отличается (страница изменилась), он перекомпилирует его. Вот пример того, как может выглядеть этот скомпилированный код:

#line 58 "C:\X\UserControls\FilterControl.ascx"
@__ctrl.Click -= new System.EventHandler(this.btnApply_Click);

#line default
#line hidden

#line 58 "C:\X\UserControls\FilterControl.ascx"
@__ctrl.Click += new System.EventHandler(this.btnApply_Click);

Это, конечно, компилируется в исполняемую сборку. По сути, ASPX-компилятор компилирует разметку на стороне сервера в код C #, а затем компилирует ее в сборку.

1 голос
/ 13 декабря 2011

ASP.NET фактически генерирует класс, нисходящий с вашей страницы, используя разметку ASPX в качестве своего рода шаблона.Вы можете найти исходный код сгенерированных классов в папках в папке% WINDIR% \ Microsoft.NET \ v [FRAMEWORK VERSION] \ Temporary ASP.NET File.

Насколько я понимаю, он генерирует класс, который создает экземпляр элемента управления исвязывает обработчики событий с любым применяемым методом.Вот почему дела обстоят плохо, когда вы, скажем, делаете свой обработчик событий частным - класс-потомок не может получить к нему доступ.

Генерация кода довольно дорога заранее;он частично ответственен за длительную разминку asp.net, от которой страдает большинство разработчиков asp.net.Но это очень и очень эффективно, когда приложение разогревается, так как все выполняется с помощью скомпилированного кода.

0 голосов
/ 13 декабря 2011

Нет, это не использует отражение. Как сказал @Wyatt Barnett, компилятор генерирует код для этого. Сгенерированный код такой же, как если бы вы регистрировали событие самостоятельно.

btnNew.Click += new EventHandler(btnNew_Click);

Когда генерируется код для разметки, он одинаков в отношении производительности, возможно, за исключением первого вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...