1.匿名方法
在C#1.0中典型的給一個(gè)委托添加一個(gè)方法調(diào)用代碼如下:
PRivate void ctrl_Click (object sender,EventArgs e)
txt.Click += new MyDelegate(ctrl_Click);
private ctrl_Click(object sender,EventArgs e)
{
Message.Show(...);
}
哪怕只有這么一條語句也必須得按上面的形式給事件的調(diào)用列表添加方法,還得創(chuàng)建一個(gè)委托的實(shí)例
在C#2.0中引入了匿名方法,大大簡化了上述操作
可以改寫為
txt.Click += delegate {Message.Show();}
或是這樣:
txt.Click += ctrl_Click也是允許的.
C#編譯器對上述的定義自動隱式轉(zhuǎn)化,只要匿名方法和委托的定義兼容.
符合下列條件可以兼容
1.參數(shù)兼容
如果匿名方法沒有參數(shù),委托中沒有out參數(shù)
如果匿名方法和委托的參數(shù)在數(shù)量,類型,順序上都一致
2.返回值兼容
如果委托沒有返回值,匿名方法中也沒有返回值或匿名方法中只有return不帶返回值
如果兩者都有返回值,并且匿名方法的返回值可以隱式轉(zhuǎn)化為委托定義的類型
符合參數(shù)和返回值兼容的就可以使用匿名方法
匿名方法的捕獲變量(capture variable)
如果局部變量或參數(shù)的作用范圍內(nèi)包含匿名方法聲明,則該局部變量或參數(shù)稱為該匿名方法的外部變量或捕獲變量
public void method1(bool enabled)
{
string b;
this.txt.Click += delegate
{
this.txt.enabled = enabled;
this.txt.Text = b;
}
}
對于這個(gè)匿名方法來說:參數(shù)enabled和變量a是它的捕獲變量或叫外部變量.
捕獲變量的生命周期直到此匿名方法的資源被回收而結(jié)束
2.泛型
關(guān)于泛型的定義及如何使用網(wǎng)上資料已經(jīng)很多,請參見MSDN
3.迭代器(iterators)
在C#1.0中若想要使得類型成為可枚舉的類型(即象使用數(shù)組一樣用foreach一樣枚舉數(shù)組中的成員),那么這個(gè)類中必須實(shí)現(xiàn)IEnumerable接口的GetEnumerator()方法返回IEnumerator
public IEnumerator GetEnumerator()
{..}
一般來說實(shí)現(xiàn)GetEnumerator是不容易的.
在C#2.0中引入了的新的語法擴(kuò)充:迭代器,它能夠很好的簡單方便的讓我們實(shí)現(xiàn)GetEnumerator()方法
如:
public IEnumerator GetEnumerator()
{
for ( int i = 0; i < 10; i ++)
{
yield return i;
}
}
假設(shè)類Class1中實(shí)現(xiàn)了上述的GetEnumertor方法
那我們就可以用foreach對類Class1進(jìn)行枚舉
Class1 c = new Class1;
foreach ( int i in c)
{
Console.WriteLine(i);
}
yield return產(chǎn)生迭代的下一個(gè)值,yield break說明迭代完成,用迭代器實(shí)現(xiàn)就是這么簡單.
定義和使用命名迭代器
class Class1
{
public IEnumerator GetEnumerator()
{
for (int i = 0; i < 10; i++)
{
yield return i;
}
}
// 定義一個(gè)命名的迭代器,并可以提供參數(shù)
public IEnumerable MaxToMin(int min, int max)
{
for (int i = max; i >= min; i--)
{
yield return i;
}
}
// 定義一個(gè)迭代器類型的屬性,
public IEnumerable MinToMax
{
// this表示該類實(shí)例,因?yàn)樵擃悓?shí)現(xiàn)了GetEnumerator(),它是可枚舉的
get { yield return this; }
}
public IEnumerable GetDescriptions()
{
yield return "this is my test";
yield return "class name is class1";
yield return "ktgu";
}
}
static void Main(string[] args)
{
Class1 c = new Class1();
foreach (int i in c)
{
Console.WriteLine(i);
}
foreach (int i in c.MaxToMin(1, 10))
{
Console.WriteLine(i);
}
foreach (int i in c.MinToMax)
{
Console.WriteLine(i);
}
foreach (string s in c.GetDescriptions())
{
Console.WriteLine(s);
}
}
4.不完整代碼
C#2.0中引入了一個(gè)"不全代碼"的概念,即你可以將一個(gè)類的定義放在別的文件中.這樣給大項(xiàng)目,大文件的維護(hù)帶來方便.
聲明:
[modifiers] partial type
modifier: [public/private/protected/internal] abstract new override static virtual extern
type:類/結(jié)構(gòu)/接口
以上主要是偏向于介紹如何快速的應(yīng)用這些新的語法點(diǎn),詳細(xì)概念及要領(lǐng)請參見MSDN
http://www.survivalescaperooms.com/ktgu/archive/2006/11/29/576368.html
新聞熱點(diǎn)
疑難解答
圖片精選