我们接着看第二个类:
Code

这些都是实例化一些对象的,我们重点看下BuildControlLabel1函数,
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
        
private global::System.Web.UI.WebControls.Label @__BuildControlLabel1() {
            
global::System.Web.UI.WebControls.Label @__ctrl;
            
            
#line 13 "F:\WebSite8\Default.aspx"
            @__ctrl 
= new global::System.Web.UI.WebControls.Label();
            
            
#line default
            
#line hidden
            
this.Label1 = @__ctrl;
            @__ctrl.ApplyStyleSheetSkin(
this);
            
            
#line 13 "F:\WebSite8\Default.aspx"
            @__ctrl.ID 
= "Label1";
            
            
#line default
            
#line hidden
            
            
#line 13 "F:\WebSite8\Default.aspx"
            @__ctrl.DataBinding 
+= new System.EventHandler(this.@__DataBindingLabel1);
            
            
#line default
            
#line hidden
            
return @__ctrl;
        }

首先,定义各一个Label类型的引用@__ctrl,然后实例化Label对象,并赋给该引用.
如果你对引用不太熟悉,你可以想象下,家里厨房中有个瓶子,你给瓶子贴上标签,这个标签就相当于引用,这个标签代表了这个瓶子.
然后,this.Label1=@__ctrl,前面我们已经知道,Label1是Label类型的,那么把一个引用赋给另一个引用又代表什么呢?
既然,@__ctrl代表了一个瓶子,this.Label1=@__ctrl,说明Label1和@__ctrl代表的是同一样东西,相当于给瓶子再贴个标签.
接着往下看,
@__ctrl.ApplyStyleSheetSkin(this); //应用皮肤
@__ctrl.DataBinding += new System.EventHandler(this.@__DataBindingLabel1);
指定DataBinding事件的事件处理函数this.@__DataBindingLabel1

public void @__DataBindingLabel1(object sender, System.EventArgs e) {
            System.Web.UI.WebControls.Label dataBindingExpressionBuilderTarget;
            System.Web.UI.Page Container;
            dataBindingExpressionBuilderTarget 
= ((System.Web.UI.WebControls.Label)(sender));
            Container 
= ((System.Web.UI.Page)(dataBindingExpressionBuilderTarget.BindingContainer));
            
            
#line 13 "F:\WebSite8\Default.aspx"
            dataBindingExpressionBuilderTarget.Text 
= System.Convert.ToString( DateTime.Now , System.Globalization.CultureInfo.CurrentCulture);
            
            
#line default
            
#line hidden

分别创建Label类型和Page类型的引用.
将send转型,因为我们知道DataBinding事件的发送者是Label控件嘛..
BindingContainer代表数据源容器,也是就数据是属于哪个对象的.
然后将DateTime.Now的值赋给Label控件的Text属性,没什么好说的
 protected override void FrameworkInitialize() {
            
base.FrameworkInitialize();
            
this.@__BuildControlTree(this);
            
this.AddWrappedFileDependencies(global::ASP.default_aspx.@__fileDependencies);
            
this.Request.ValidateInput();
        }

虚函数重写,首先调用框架的初始化函数,接着构造控件树,AddWrappedFileDependencies,我们回到该类的头部.
  private static bool @__initialized;
        
        
private static object @__fileDependencies;
        
        [System.Diagnostics.DebuggerNonUserCodeAttribute()]
        
public default_aspx() {
            
string[] dependencies;
            
            
#line 912304 "F:\WebSite8\Default.aspx.cs"
            ((
global::System.Web.UI.Page)(this)).AppRelativeVirtualPath = "~/Default.aspx";
            
            
#line default
            
#line hidden
            
if ((global::ASP.default_aspx.@__initialized == false)) {
                dependencies 
= new string[2];
                dependencies[
0= "~/Default.aspx";
                dependencies[
1= "~/Default.aspx.cs";
                
global::ASP.default_aspx.@__fileDependencies = this.GetWrappedFileDependencies(dependencies);
                
global::ASP.default_aspx.@__initialized = true;
            }
            
this.Server.ScriptTimeout = 30000000;

AppRelativeVirtualPath指明该页的虚拟路径,如果没有初始化,那么初始化他.
构造一个dependencies的string数组,GetWrappedFileDependencies函数说明该窗体页的依赖文件.
设置@__initialized为true表明该页已被初始化.
再回到函数,接着往下看,
this.Request.ValidateInput();  //验证输入
 public override int GetTypeHashCode() {
            
return -324718635;
        }

查看msdn,检索由运行时生成的 Page 对象生成的哈希代码。这种哈希代码对于 Page 对象的控件层次结构是唯一的.
也就是说该散列代码标识页面控件层次结构.
我在default.aspx页中随便添加一个控件,重新编译该页面,发现该值并没改变,说明他是唯一的,大家可以自行实验.
public override void ProcessRequest(System.Web.HttpContext context) {
            
base.ProcessRequest(context);
处理请求...
下面我们来看第二个类,在看之前,不知道大家有没发现,如果我往default.aspx页中添加控件,重新编译,asp.net会重新生成相关的类,如果我不改变页面结构,再次提交请求,asp.net不会重新生成类.
打开App_Web_XXXXXXXX.1.cs和我们的代码隐藏文件基本相同,App_Web_XXXXXXXX.2.cs里面调用了一个工厂方法.正如他的名字所暗示的FastObjectFactory,这是一个快速工厂,避免了反射带来的性能损失.并返回该页面的实例.
工厂方法的作用也是就将实例化一个类的过程交给工厂类来完成.
总结:

问题:
Page.Load+=new EventHandler(Page_Load)
在哪个函数里面注册的?
希望高手指点...
posted on 2008-04-19 15:28  杨一锋  阅读(526)  评论(1编辑  收藏  举报