以前好多文章都是轉載的,現在終於也想自己動手寫文章了,已經好久沒自己寫文章了,希望這篇文章能在以後複習的時候,讓自己少走一點彎路。
1.熟悉partial
在vs2003中我們經常會發現在每個類都是一個單獨的文件,這樣讓人感覺起來很煩瑣,因爲類中好多內容都是IDE(也就是VS2003)自己生成的,開發人員並不是很關注它的存在,但它卻並沒有被隱藏起來,這樣的話,開發人員就會感到代碼的冗餘性,由此引發出了partial部分類的定義,這個可以將一個類分成幾個部分的部分類,然後由CLR編譯後,在根據partial關鍵字和是否是同一類來將多個部分類整合成爲一個類,注意這裏的動作都是編譯器來完成的,感覺每次微軟在發佈新產品的時候,東西都要和舊產品有很大出入,不過,它使編程更加傻瓜話了。VS2005引入了partial類
在winform中 vs2005IDE自動生成3個類:Form1.cs,Form1.Designer.cs,Program.cs,前兩者引入了部分類的效果,Program.cs把entryPoint也就是入口點定位到了一個類中,這樣開發人員不必要看到IDE是怎麼來設計Form的,也就使代碼更加簡單,直觀了,分工更加明確了。
Form1:
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication2
...{
public partial class Form1 : Form
...{
public Form1()
...{
InitializeComponent();
}
}
}
Form1.Designer.cs:
...{
partial class Form1
...{
/**//// <summary>
/// 必需的設計器變量。
/// </summary>
private System.ComponentModel.IContainer components = null;
/**//// <summary>
/// 清理所有正在使用的資源。
/// </summary>
/// <param name="disposing">如果應釋放託管資源,爲 true;否則爲 false。</param>
protected override void Dispose(bool disposing)
...{
if (disposing && (components != null))
...{
components.Dispose();
}
base.Dispose(disposing);
}
Windows 窗體設計器生成的代碼#region Windows 窗體設計器生成的代碼
/**//// <summary>
/// 設計器支持所需的方法 - 不要
/// 使用代碼編輯器修改此方法的內容。
/// </summary>
private void InitializeComponent()
...{
this.components = new System.ComponentModel.Container();
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Text = "Form1";
}
#endregion
}
}
在winform中我們可以很直觀的觀察到partial的應用,而在webform中我們卻發現有了很大出入,這個將會在稍後講到
2.partial應用的注意事項
(1)必須在每個部分聲明上重複出現的類型聲明元素
(2)在每個部分聲明上可選重複出現的類型聲明元素:
可以出現的類型聲明元素,可以重複出現在同一類型的不同的部分定義上。最後的效果將是每個部分聲明上的這些類型聲明元素效果的並集。
- abstract和sealed關鍵字
- 類型的可見性即訪問級別
- 類型的基類(注意出現不同的基類的時候,會報錯)
- 類型參數的一組約束
(3)在多個部分聲明上重複出現就會累積效果的類型聲明元素
C# 2.0會自動檢測出衝突的錯誤,比如在同一個類的多個部分聲明中定義相同的方法
- 成員:定義在多個源文件中的某一個類型的成員就是每個部分定義中成員的總合
- attribute:定義在多個源文件中的某一個類型的attribute就是每個部分定義中attribute的總合
- 實現的接口:定義在多個源文件中的某一個類型所實現的接口就是每個部分定義中所實現的接口的總合
熱身完了,現在進入今天的正題:
尋找asp.net 2.0 partial的兄弟們:
我們先用vs2005建立一個web程序,隨便建立一個webform,名字任意這裏生成xdfgs.aspx和xdfgs.aspx.cs
xdfgs.aspx.cs:
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class xdfgs : System.Web.UI.Page
...{
protected void Page_Load(object sender, EventArgs e)
...{
}
}
xdfgs.aspx:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>無標題頁</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="Button" />
</div>
</form>
</body>
</html>
這裏partial聲明的部分類卻沒有找到令一半,去掉以後又不可以,這就很鬱悶了,沒關係,我們今天的工作就是尋找其他部分。
運行後,我們會發現vs2005自己有專門的服務器應用程序webdev.webserver.exe來專門運行web application應用程序,我應該知道既然在我們建立源文件的那個文件中沒有dll文件,然後它卻能運行,這說明它已經被編譯了,至於存在什麼地方這就是我現在開始要找的東西了,利用我的電腦當中的搜索功能:
- 文件名不寫
- 文件中的一個字和詞組寫入:partial class xdfgs
- 在這裏查找找到:C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727
這樣點擊查找後,可以找到四個cs文件,仔細觀察下他的日期他們當中兩兩一致,如果是第一次編譯,會只有兩個,當第二次編譯的時候就會出現四個,這就說明有兩個cs文件是上次運行時候某個工具解析出來的結果,兩個cs文件是這次運行時候解析的結果。他們都是在臨時文件夾中的,名字是由解析工具隨機生成的,那現在來看看他裏面有什麼內容
App_Web_ngewhs4b.1.cs:
//------------------------------------------------------------------------------
// <auto-generated>
// 此代碼由工具生成。
// 運行庫版本:2.0.50727.832
//
// 對此文件的更改可能會導致不正確的行爲,並且如果
// 重新生成代碼,這些更改將會丟失。
// </auto-generated>
//------------------------------------------------------------------------------
public partial class xdfgs : System.Web.SessionState.IRequiresSessionState ...{
#line 13 "G:5項目程序GetSchemaßgs.aspx"
protected global::System.Web.UI.WebControls.TextBox TextBox1;
#line default
#line hidden
#line 14 "G:5項目程序GetSchemaßgs.aspx"
protected global::System.Web.UI.WebControls.Button Button1;
#line default
#line hidden
#line 11 "G:5項目程序GetSchemaßgs.aspx"
protected global::System.Web.UI.HtmlControls.HtmlForm form1;
#line default
#line hidden
protected System.Web.Profile.DefaultProfile Profile ...{
get ...{
return ((System.Web.Profile.DefaultProfile)(this.Context.Profile));
}
}
protected System.Web.HttpApplication ApplicationInstance ...{
get ...{
return ((System.Web.HttpApplication)(this.Context.ApplicationInstance));
}
}
}
namespace ASP ...{
#line 320 "C:WINDOWSMicrosoft.NETFrameworkv2.0.50727Configweb.config"
using System.Web.Profile;
#line default
#line hidden
#line 315 "C:WINDOWSMicrosoft.NETFrameworkv2.0.50727Configweb.config"
using System.Text.RegularExpressions;
#line default
#line hidden
#line 317 "C:WINDOWSMicrosoft.NETFrameworkv2.0.50727Configweb.config"
using System.Web.Caching;
#line default
#line hidden
#line 313 "C:WINDOWSMicrosoft.NETFrameworkv2.0.50727Configweb.config"
using System.Configuration;
#line default
#line hidden
#line 312 "C:WINDOWSMicrosoft.NETFrameworkv2.0.50727Configweb.config"
using System.Collections.Specialized;
#line default
#line hidden
#line 13 "G:5項目程序GetSchemaßgs.aspx"
using System.Web.UI.WebControls.WebParts;
#line default
#line hidden
#line 324 "C:WINDOWSMicrosoft.NETFrameworkv2.0.50727Configweb.config"
using System.Web.UI.HtmlControls;
#line default
#line hidden
#line 13 "G:5項目程序GetSchemaßgs.aspx"
using System.Web.UI.WebControls;
#line default
#line hidden
#line 321 "C:WINDOWSMicrosoft.NETFrameworkv2.0.50727Configweb.config"
using System.Web.UI;
#line default
#line hidden
#line 311 "C:WINDOWSMicrosoft.NETFrameworkv2.0.50727Configweb.config"
using System.Collections;
#line default
#line hidden
#line 310 "C:WINDOWSMicrosoft.NETFrameworkv2.0.50727Configweb.config"
using System;
#line default
#line hidden
#line 319 "C:WINDOWSMicrosoft.NETFrameworkv2.0.50727Configweb.config"
using System.Web.Security;
#line default
#line hidden
#line 316 "C:WINDOWSMicrosoft.NETFrameworkv2.0.50727Configweb.config"
using System.Web;
#line default
#line hidden
#line 318 "C:WINDOWSMicrosoft.NETFrameworkv2.0.50727Configweb.config"
using System.Web.SessionState;
#line default
#line hidden
#line 314 "C:WINDOWSMicrosoft.NETFrameworkv2.0.50727Configweb.config"
using System.Text;
#line default
#line hidden
[System.Runtime.CompilerServices.CompilerGlobalScopeAttribute()]
public class xdfgs_aspx : global::xdfgs, System.Web.IHttpHandler ...{
private static bool @__initialized;
private static object @__fileDependencies;
public xdfgs_aspx() ...{
string[] dependencies;
#line 912304 "G:5項目程序GetSchemaßgs.aspx.cs"
((System.Web.UI.Page)(this)).AppRelativeVirtualPath = "~/xdfgs.aspx";
#line default
#line hidden
if ((global::ASP.xdfgs_aspx.@__initialized == false)) ...{
dependencies = new string[2];
dependencies[0] = "~/xdfgs.aspx";
dependencies[1] = "~/xdfgs.aspx.cs";
global::ASP.xdfgs_aspx.@__fileDependencies = this.GetWrappedFileDependencies(dependencies);
global::ASP.xdfgs_aspx.@__initialized = true;
}
this.Server.ScriptTimeout = 30000000;
}
private global::System.Web.UI.HtmlControls.HtmlTitle @__BuildControl__control3() ...{
global::System.Web.UI.HtmlControls.HtmlTitle @__ctrl;
#line 7 "G:5項目程序GetSchemaßgs.aspx"
@__ctrl = new global::System.Web.UI.HtmlControls.HtmlTitle();
#line default
#line hidden
System.Web.UI.IParserAccessor @__parser = ((System.Web.UI.IParserAccessor)(@__ctrl));
#line 7 "G:5項目程序GetSchemaßgs.aspx"
@__parser.AddParsedSubObject(new System.Web.UI.LiteralControl("無標題頁"));
#line default
#line hidden
return @__ctrl;
}
private global::System.Web.UI.HtmlControls.HtmlHead @__BuildControl__control2() ...{
global::System.Web.UI.HtmlControls.HtmlHead @__ctrl;
#line 6 "G:5項目程序GetSchemaßgs.aspx"
@__ctrl = new global::System.Web.UI.HtmlControls.HtmlHead("head");
#line default
#line hidden
global::System.Web.UI.HtmlControls.HtmlTitle @__ctrl1;
#line 6 "G:5項目程序GetSchemaßgs.aspx"
@__ctrl1 = this.@__BuildControl__control3();
#line default
#line hidden
System.Web.UI.IParserAccessor @__parser = ((System.Web.UI.IParserAccessor)(@__ctrl));
#line 6 "G:5項目程序GetSchemaßgs.aspx"
@__parser.AddParsedSubObject(@__ctrl1);
#line default
#line hidden
return @__ctrl;
}
private global::System.Web.UI.WebControls.TextBox @__BuildControlTextBox1() ...{
global::System.Web.UI.WebControls.TextBox @__ctrl;
#line 13 "G:5項目程序GetSchemaßgs.aspx"
@__ctrl = new global::System.Web.UI.WebControls.TextBox();
#line default
#line hidden
this.TextBox1 = @__ctrl;
@__ctrl.ApplyStyleSheetSkin(this);
#line 13 "G:5項目程序GetSchemaßgs.aspx"
@__ctrl.ID = "TextBox1";
#line default
#line hidden
return @__ctrl;
}
private global::System.Web.UI.WebControls.Button @__BuildControlButton1() ...{
global::System.Web.UI.WebControls.Button @__ctrl;
#line 14 "G:5項目程序GetSchemaßgs.aspx"
@__ctrl = new global::System.Web.UI.WebControls.Button();
#line default
#line hidden
this.Button1 = @__ctrl;
@__ctrl.ApplyStyleSheetSkin(this);
#line 14 "G:5項目程序GetSchemaßgs.aspx"
@__ctrl.ID = "Button1";
#line default
#line hidden
#line 14 "G:5項目程序GetSchemaßgs.aspx"
@__ctrl.Text = "Button";
#line default
#line hidden
return @__ctrl;
}
private global::System.Web.UI.HtmlControls.HtmlForm @__BuildControlform1() ...{
global::System.Web.UI.HtmlControls.HtmlForm @__ctrl;
#line 11 "G:5項目程序GetSchemaßgs.aspx"
@__ctrl = new global::System.Web.UI.HtmlControls.HtmlForm();
#line default
#line hidden
this.form1 = @__ctrl;
#line 11 "G:5項目程序GetSchemaßgs.aspx"
@__ctrl.ID = "form1";
#line default
#line hidden
System.Web.UI.IParserAccessor @__parser = ((System.Web.UI.IParserAccessor)(@__ctrl));
#line 11 "G:5項目程序GetSchemaßgs.aspx"
@__parser.AddParsedSubObject(new System.Web.UI.LiteralControl(" <div> "));
#line default
#line hidden
global::System.Web.UI.WebControls.TextBox @__ctrl1;
#line 11 "G:5項目程序GetSchemaßgs.aspx"
@__ctrl1 = this.@__BuildControlTextBox1();
#line default
#line hidden
#line 11 "G:5項目程序GetSchemaßgs.aspx"
@__parser.AddParsedSubObject(@__ctrl1);
#line default
#line hidden
#line 11 "G:5項目程序GetSchemaßgs.aspx"
@__parser.AddParsedSubObject(new System.Web.UI.LiteralControl(" "));
#line default
#line hidden
global::System.Web.UI.WebControls.Button @__ctrl2;
#line 11 "G:5項目程序GetSchemaßgs.aspx"
@__ctrl2 = this.@__BuildControlButton1();
#line default
#line hidden
#line 11 "G:5項目程序GetSchemaßgs.aspx"
@__parser.AddParsedSubObject(@__ctrl2);
#line default
#line hidden
#line 11 "G:5項目程序GetSchemaßgs.aspx"
@__parser.AddParsedSubObject(new System.Web.UI.LiteralControl(" </div> "));
#line default
#line hidden
return @__ctrl;
}
private void @__BuildControlTree(xdfgs_aspx @__ctrl) ...{
#line 1 "G:5項目程序GetSchemaßgs.aspx"
this.InitializeCulture();
#line default
#line hidden
System.Web.UI.IParserAccessor @__parser = ((System.Web.UI.IParserAccessor)(@__ctrl));
#line 1 "G:5項目程序GetSchemaßgs.aspx"
@__parser.AddParsedSubObject(new System.Web.UI.LiteralControl(" <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3" +
".org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1" +
"999/xhtml" > "));
#line default
#line hidden
global::System.Web.UI.HtmlControls.HtmlHead @__ctrl1;
#line 1 "G:5項目程序GetSchemaßgs.aspx"
@__ctrl1 = this.@__BuildControl__control2();
#line default
#line hidden
#line 1 "G:5項目程序GetSchemaßgs.aspx"
@__parser.AddParsedSubObject(@__ctrl1);
#line default
#line hidden
#line 1 "G:5項目程序GetSchemaßgs.aspx"
@__parser.AddParsedSubObject(new System.Web.UI.LiteralControl(" <body> "));
#line default
#line hidden
global::System.Web.UI.HtmlControls.HtmlForm @__ctrl2;
#line 1 "G:5項目程序GetSchemaßgs.aspx"
@__ctrl2 = this.@__BuildControlform1();
#line default
#line hidden
#line 1 "G:5項目程序GetSchemaßgs.aspx"
@__parser.AddParsedSubObject(@__ctrl2);
#line default
#line hidden
#line 1 "G:5項目程序GetSchemaßgs.aspx"
@__parser.AddParsedSubObject(new System.Web.UI.LiteralControl(" </body> </html> "));
#line default
#line hidden
}
#line 912304 "G:5項目程序GetSchemaßgs.aspx.cs"
protected override void FrameworkInitialize() ...{
base.FrameworkInitialize();
this.@__BuildControlTree(this);
this.AddWrappedFileDependencies(global::ASP.xdfgs_aspx.@__fileDependencies);
this.Request.ValidateInput();
}
#line default
#line hidden
public override int GetTypeHashCode() ...{
return 1906785201;
}
public override void ProcessRequest(System.Web.HttpContext context) ...{
base.ProcessRequest(context);
}
}
}
這裏只看重點的,這裏出現了partial的另一個類,其實這段代碼是由工具解析相應的aspx文件自動生成的,#line只是個指令而已,經過CLR編譯後就沒有了
#line 13 "G:5項目程序GetSchemaßgs.aspx"
protected global::System.Web.UI.WebControls.TextBox TextBox1;
#line default
#line hidden
#line 14 "G:5項目程序GetSchemaßgs.aspx"
protected global::System.Web.UI.WebControls.Button Button1;
#line default
#line hidden
#line 11 "G:5項目程序GetSchemaßgs.aspx"
protected global::System.Web.UI.HtmlControls.HtmlForm form1;
#line default
#line hidden
protected System.Web.Profile.DefaultProfile Profile ...{
get ...{
return ((System.Web.Profile.DefaultProfile)(this.Context.Profile));
}
}
protected System.Web.HttpApplication ApplicationInstance ...{
get ...{
return ((System.Web.HttpApplication)(this.Context.ApplicationInstance));
}
}
}
在這個類中有了控件聲明,還多兩個屬性
奇怪的是出現的另一個文件的內容中的類居然和xdfgs.aspx.cs相同,這就意味着需要加載進來這個文件,然後生成一個新的文件App_Web_ngewhs4b.2.cs
App_Web_ngewhs4b.2.cs:
#line 1 "G:5項目程序GetSchemaßgs.aspx.cs"
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class xdfgs : System.Web.UI.Page
...{
protected void Page_Load(object sender, EventArgs e)
...{
}
}
#line default
#line hidden
然後編譯器就可以將這兩個cs文件編譯,將當中的部分類整和成一個類了,最後生成一個App_Web_ngewhs4b.dll程序集當中包含兩個有兩個類值得關注一個是 xdfgs 命名空間是"_" 而令一個是 xdfgs_aspx 命名空間是"asp",很奇怪吧 後者是由編譯器,造成的命名空間是"asp"的,前者是默認的沒有給命名空間的時候都放在"_"命名空間中
用reflector來查看,他們被整合在一起了:
xdfgs.cs:
...{
// Fields
protected Button Button1;
protected HtmlForm form1;
protected TextBox TextBox1;
// Methods
protected void Page_Load(object sender, EventArgs e)
...{
}
// Properties
protected HttpApplication ApplicationInstance
...{
get
...{
return this.Context.ApplicationInstance;
}
}
protected DefaultProfile Profile
...{
get
...{
return (DefaultProfile) this.Context.get_Profile();
}
}
}
xdfgs_aspx:
public class xdfgs_aspx : xdfgs, IHttpHandler
...{
// Fields
private static object __fileDependencies;
private static bool __initialized;
// Methods
public xdfgs_aspx()
...{
base.set_AppRelativeVirtualPath("~/xdfgs.aspx");
if (!__initialized)
...{
string[] dependencies = new string[] ...{ "~/xdfgs.aspx", "~/xdfgs.aspx.cs" };
__fileDependencies = base.GetWrappedFileDependencies(dependencies);
__initialized = true;
}
base.Server.ScriptTimeout = 0x1c9c380;
}
private HtmlHead __BuildControl__control2()
...{
HtmlHead __ctrl = new HtmlHead("head");
HtmlTitle __ctrl1 = this.__BuildControl__control3();
IParserAccessor __parser = __ctrl;
__parser.AddParsedSubObject(__ctrl1);
return __ctrl;
}
private HtmlTitle __BuildControl__control3()
...{
HtmlTitle __ctrl = new HtmlTitle();
IParserAccessor __parser = __ctrl;
__parser.AddParsedSubObject(new LiteralControl("無標題頁"));
return __ctrl;
}
private Button __BuildControlButton1()
...{
Button __ctrl = new Button();
base.Button1 = __ctrl;
__ctrl.ApplyStyleSheetSkin(this);
__ctrl.ID = "Button1";
__ctrl.Text = "Button";
return __ctrl;
}
private HtmlForm __BuildControlform1()
...{
HtmlForm __ctrl = new HtmlForm();
base.form1 = __ctrl;
__ctrl.ID = "form1";
IParserAccessor __parser = __ctrl;
__parser.AddParsedSubObject(new LiteralControl(" <div> "));
TextBox __ctrl1 = this.__BuildControlTextBox1();
__parser.AddParsedSubObject(__ctrl1);
__parser.AddParsedSubObject(new LiteralControl(" "));
Button __ctrl2 = this.__BuildControlButton1();
__parser.AddParsedSubObject(__ctrl2);
__parser.AddParsedSubObject(new LiteralControl(" </div> "));
return __ctrl;
}
private TextBox __BuildControlTextBox1()
...{
TextBox __ctrl = new TextBox();
base.TextBox1 = __ctrl;
__ctrl.ApplyStyleSheetSkin(this);
__ctrl.ID = "TextBox1";
return __ctrl;
}
private void __BuildControlTree(xdfgs_aspx __ctrl)
...{
this.InitializeCulture();
IParserAccessor __parser = __ctrl;
__parser.AddParsedSubObject(new LiteralControl(" <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > "));
HtmlHead __ctrl1 = this.__BuildControl__control2();
__parser.AddParsedSubObject(__ctrl1);
__parser.AddParsedSubObject(new LiteralControl(" <body> "));
HtmlForm __ctrl2 = this.__BuildControlform1();
__parser.AddParsedSubObject(__ctrl2);
__parser.AddParsedSubObject(new LiteralControl(" </body> </html> "));
}
protected override void FrameworkInitialize()
...{
base.FrameworkInitialize();
this.__BuildControlTree(this);
base.AddWrappedFileDependencies(__fileDependencies);
base.Request.ValidateInput();
}
public override int GetTypeHashCode()
...{
return 0x71a73bb1;
}
public override void ProcessRequest(HttpContext context)
...{
base.ProcessRequest(context);
}
}
OK,現在已經清晰了,partial的另一個類也找到了。以後只要再訪問這個站點如果沒變化就可以不用再編譯了。
累了,可能寫的有些亂,不過自認爲有很多東西已經很清楚了,請各位看官感覺哪兒不對的或有自己想法的可以自己留言,大家一起討論下。