正如@Marc 所说,ASP.NET 似乎为此使用了缓存。见内部TemplateControl.HookUpAutomaticHandlers
。
此方法的一部分使用dotPeek:
internal void HookUpAutomaticHandlers()
{
...
object obj = TemplateControl._eventListCache[(object) this.GetType()];
if (obj == null)
{
lock (TemplateControl._lockObject)
{
obj = TemplateControl._eventListCache[(object) this.GetType()];
if (obj == null)
{
IDictionary local_1_1 = (IDictionary) new ListDictionary();
this.GetDelegateInformation(local_1_1);
obj = local_1_1.Count != 0 ? (object) local_1_1 : TemplateControl._emptyEventSingleton;
TemplateControl._eventListCache[(object) this.GetType()] = obj;
}
}
}
...
私有GetDelegateInformation
方法负责为控件创建委托。
TemplateControl._eventListCache
是一个Hashtable
持有每个模板控件的委托。
所以,回答你的问题:
他对每个请求都这样做吗?
答案是不。ASP.NET 执行一次来填充 this Hashtable
,然后使用缓存的值。