尊重作者,請保留 www.it55.com 連結字樣。
這一節我們繼續一起學習C# 2.0的新特性 匿名方法、迭代器、局部類。
這些新特性可以說是C# 2.0的精華部分之一,利用這些新特性可以很大程度上降低代碼重複率和減少代碼編寫量。
剛才誰扔雞蛋來著?不就剛剛說了兩句廢話嗎?用得著這樣對我嗎?好,不說廢話,咱們一起開始吧!
1、匿名方法
上節我們講過委託的用法,大家會感到很麻煩。先是建立一個靜態類或方法,然後聲明一個委託並構造。
匿名方法的到來,讓大家為之興奮。先來看個簡單的例子:
Button bt;
public void test()
{
bt.Click += delegate {MessageBox.Show("你點擊了按鈕!");};
}
如果用委託實現就需要這麼做:
Button bt;
public void test()
{
bt.Click += new EventHandler(AddClick);//EventHandler其實就是系統類別庫中的一個委託。
}
.....
void AddClick(object sender, EventArgs e)
{
MessageBox.Show("你點擊了按鈕!");
}
上面是一個不帶參數的匿名方法,如果用帶參數的也可以這樣實現(要求參數數量和類型要一致):
bt.Click += delegate(object obj, EventArgs er) { MessageBox.Show("你點擊了按鈕!"); };
匿名方法允許將一段委託關聯的代碼以代碼塊的方式內嵌到使用委託的地方,可以省略委託的方法的構造過程。
另外,匿名方法能夠共用對本地函數成員的訪問:
class Test
{
delegate void D();
static void Main()
{
bool flag = false;
D d = delegate{
if(flag)//讀取本地成員flag
Console.WriteLine("True");
else
flag = true;//改寫本地成員flag
};
}
}
2、迭代器
為瞭解釋c# 2.0中的迭代器,我們需要先認識一下以下framework中的介面類:
(1)彙總型System.Collections.IEnumerable
(將System.Collections.IEnumerator作為子類建立)
public System.Collections.IEnumerator GetEnumerator()
利用IEnumerable可以產生有序的彙總型對象集合。
(2)枚舉型,作用:對彙總型對象集合進行枚舉。
System.Collections.IEnumerator
方法:
public object Current
public void Reset()
public bool MoveNext()
下面我們來說說C# 2.0中的迭代器。使用迭代器,我們能夠在不實現IEnumerable介面或者IEnumerator介面成員的條件下很方便的實作類別、結構體的枚舉。
來看一個例子:
//建立方法
public class Test : System.Collections.IEnumerable
{
string[] v = { "a", "b", "c", "d", "e", "f", "g" };//當然,這裡也可以是某個類的實體列表
public static System.Collections.IEnumerator GetEnumerator()
{
for (int i = 0; i < v.Length; i++)
{
yield return v[i];
}
}
}
//第一種應用方法
while (Test.GetEnumerator().MoveNext())
{
string obj = (string)ee.Current;
System.Console.WriteLine(obj);
}
//第二種方法:隱式使用
foreach (string obj1 in Test.GetEnumerator())
{
System.Console.WriteLine(obj1);
}
以上程式輸出結果(兩種應用方法結果相同):
a
b
c
d
e
f
g
3、局部類
在C# 1.X中,我們只允許一個類的內容只能存在在一個檔案中,但是如果代碼冗長將給我們的閱讀和維護工作帶來不便。
局部類允許將類、結構、介面的內容分成小塊存放於多個檔案中,這樣不僅避免了上述問題,而且我們還可以在不破壞類的原始完整性的基礎上為它添加新的功能或者改善其方法屬性。#p#分網頁標題#e#
局部類必須使用partial關鍵詞建立類。
public partial class Test : IDisposable
{
public string GetStr()
{
return "PartialTest";
}
}
// partial類可以寫在不同的檔案裡,實際上就是取並集,類的修飾符要一致
public partial class Test
{
public int GetInt()
{
return 1;
}
}
public partial class PartialTest : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Test pt = new Test();
Response.Write(pt.GetStr());
Response.Write(pt.GetInt().ToString());
}
}
局部類型的一些限制:
所謂的局部,僅限於類本身,不支援類內部的方法。
局部類型只適用於類、結構、或介面,不支援委託或枚舉。
同一個類型的各個部分必須都有修飾符partial。
使用局部類型時,一個類型的各個部分必須位於相同的名稱空間中。
一個類型的各個部分必須被同時編譯。
至此,C# 2.0的新特性我們已經總體學完了,下一節我們再次進入Asp.Net 2.0,繼續學習Asp.Net 2.0的新特性:主版頁面