关于Partial Class

 ASP.NET 2.0 WebForm其程式碼與HTML分離的模式,採用了一個叫做CodeBeside模式新解決方案,但很多人第一直覺就會覺得有點”驚慌”,因為好不容易才學會並習慣CodeBehind模式,難道又要被淘汰?又得重學?心中頓時泛起一絲絲哀愁,覺得微軟是不是變動得太大太快?
其實諸位不必過度擔憂,我引出一段話~

  大科學家牛頓說:「如果我看得比較遠,是因為我站在巨人的肩膀上。」牛頓吸取了阿基米得和伽利略的經驗與成果,加上自己不斷的努力,才能創造出偉大的成就,發現地心引力,推導出力學三大定律。而愛因斯坦、楊振寧、李政道、李遠哲等人,也是站在牛頓的肩膀上,才能有所成就,對世界做出貢獻。

  因此科學或技術幾乎很少是Revolution,多半是Evolution;而什麼是Revolution什麼又是Evolution?Revolution是革命,可以說是重大創新或完全創新,而Evolution是演化,也就是許多目前的資訊技術無論是OS、軟體工程或演算法幾十年前早就存在了,幾十年來不過就是改良或重新包裝,殊不見有什麼叫做Revolution的技術,很少。與前一段牛頓所說,以及所有科學家都是基於前人成就再加上自己的創見而能締造很棒的成就,反觀CodeBeside就會推翻掉CodeBehind 嗎?答案是不會!因為就”技術角度”而言它是改良CodeBehind的技術,克服了一些CodeBehind缺點,並產生了一些新優點,就”使用角度” 而言,你幾乎感覺不到它有什麼不一樣?不相信…使用過ASP.NET 1.1 WebForm和ASP.NET 2.0 WebForm的人可以告訴我有什麼不一樣嗎,如果你一時之間答不上來,就代表它是一個無痛的改良。

  為何微軟必須推出一個CodeBeside來”取代”CodeBehind?勢必有某些問題或因素才必須這樣做,我們先來看看CodeBehind運作的模式:
假設你建立了一個WebForm1,則WebForm1包含了兩個部分(1)WebForm1.aspx(2) WebForm1.aspx.cs或WebForm1.aspx.vb,請參考CodeBehind運作的模式圖

運作流程:
1.WebForm1.aspx.cs或WebForm1.aspx.vb繼承Page類別,編譯成專案.dll檔。
2.WebForm1.aspx再繼承上一步驟的.dll檔 。

CodeBehind實例說明:
  假設我們在VS.NET 2003的IDE環境中 WebForm1拉進一個TextBox控制項,你可以看到三個畫面:
1.版面配置

2.HTML的.aspx檔

3.CodeBehind檔.cs或.vb

在這以實例對照CodeBehind運作模式來探討到底CodeBehind有什麼樣的問題?簡單來講有兩個:
1.你會發現拉了一個TextBox控制項後,在.aspx檔和.cs/.vb之中同時都會出現TextBox的宣告,如此一來會發生同步問題,因為若你不小心刪除或更動任一者,即有可能會發生錯誤。
2.有的專家認為這是一種奇怪的design antipattern問題。

  故為了改進CodeBehind一些缺點,改良後的稱之為CodeBeside,但這算是全新的嗎?其實不算,在某種程度你可以將之視為 CodeBehind改良、CodeBehind二代,或者叫CodePerfect、CodeHappy也不錯,總之最後設計小組不過就是用個新名字” CodeBeside”,沒什麼大不了的,也不值得大驚小怪,但這樣講還是太抽象,用一個公式表達你就會比較明瞭:

CodeBehind+Partial Class的改良=CodeBeside

這是一個簡化後的觀點,夠簡單了吧!(但可能還有其他隱含的目的,我還沒驗證故不發表)

  但在介紹CodeBeside之前得要談.NET Language 2.0的新功能Partial Class,兩者必須一起談,.NET Language 2.0支援了四種新功能:
1.Generics
2.Iterators
3.Anonymous methods
4.Partial Classes

  那什麼是Partial Classes呢?也就是可以將一個Class拆成多個檔,比如說一個類別Class中有十個methods方法,在VS 2005你可以將十個methods方法拆成十個檔案分別存放,那為什麼要這樣呢,有何好處?理由如下:
1.在一個大型的專案類別Class,你可以同時分成不同區塊交由不同程式設計師撰寫,同時進行。
2.若由系統自動產生的source,可以以獨立的partial class加入,而不必更動到原先類別。
3.若你的Class很巨大時,用Partial Class來做功能性區分也是一個不錯的分類方式。

  若有一個ExampleClass類別其中包含了十個Methods,Partial Class的型式大概是這個樣子:
檔案一:ExampleClassFile1.cs
public partial class ExampleClass
{
public void Method1()
{

}
}

檔案二:ExampleClassFile2.cs
public partial class ExampleClass
{
public void Method2()
{

}
}

檔案十:ExampleClassFile10.cs
public partial class ExampleClass
{
public void Method10()
{

}  
}

  最後編譯器在編譯時,它會認得partial class字眼,並將這十個partial class合併起來成一個ExampleClass。

  那我們來驗證一下CodeBeside是不是CodeBehind+Partial Class?首先在VS 2005建立一個專案,在WebForm中拖曳一個TextBox控制項,畫面如下:
1.版面配置

2.HTML的.aspx檔

3.CodeBeside檔.cs或.vb

各位可以看到,在CodeBeside檔.cs或.vb中完全看不到TextBox控制項的宣告,且都是使用partial class「Default_aspx」來儲存HTML檔與.cs或.vb檔,並且HTML也不再使用Inherits字眼,取而代之的是 CompileWtih,就是partial class編譯時會將兩者結合,用起來你不會有什麼感覺,甚至不知道它改了,但它的確改進了CodeBehind一些潛藏的缺點變得比較清爽,也不會令某些人那麼在意CodeBehind繼承的怪模式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值