1.匿名方法
在C#(C#培訓 )1.0中典型的給一個委托添加一個方法調用代碼如下:
private void ctrl_Click (object sender,EventArgs e)
txt.Click = new MyDelegate(ctrl_Click);
private ctrl_Click(object sender,EventArgs e)
{
Message.Show(...);
}
哪怕只有這麼一條語句也必須得按上面的形式給事件的調用列表添加方法,還得創建一個委托的實例
在C#2.0中引入了匿名方法,大大簡化了上述操作
可以改寫為
txt.Click = delegate {Message.Show();}
或是這樣:
txt.Click = ctrl_Click也是允許的.
C#編譯器對上述的定義自動隱式轉化,只要匿名方法和委托的定義兼容.
符合下列條件可以兼容
1.參數兼容
如果匿名方法沒有參數,委托中沒有out參數
如果匿名方法和委托的參數在數量,類型,順序上都一致
2.返回值兼容
如果委托沒有返回值,匿名方法中也沒有返回值或匿名方法中只有return不帶返回值
如果兩者都有返回值,並且匿名方法的返回值可以隱式轉化為委托定義的類型
符合參數和返回值兼容的就可以使用匿名方法
匿名方法的捕獲變量(capture variable) http://www.mscto.com
如果局部變量或參數的作用范圍內包含匿名方法聲明,則該局部變量或參數稱為該匿名方法的外部變量或捕獲變量
public void method1(bool enabled)
{
string b;
this.txt.Click = delegate
{
this.txt.enabled = enabled;
this.txt.Text = b;
}
}
對於這個匿名方法來說:參數enabled和變量a是它的捕獲變量或叫外部變量.
捕獲變量的生命周期直到此匿名方法的資源被回收而結束
2.泛型
關於泛型的定義及如何使用網上資料已經很多,請參見MSDN
3.迭代器(iterators)
在C#1.0中若想要使得類型成為可枚舉的類型(即象使用數組一樣用foreach一樣枚舉數組中的成員),那麼這個類中必須實現IEnumerable接口的GetEnumerator()方法返回IEnumerator
public IEnumerator GetEnumerator()
{..}
一般來說實現GetEnumerator是不容易的.
在C#2.0中引入了的新的語法擴充:迭代器,它能夠很好的簡單方便的讓我們實現GetEnumerator()方法
如:
public IEnumerator GetEnumerator()
{
for ( int i = 0; i < 10; i )
{
yIEld return i;
}
}
假設類Class1中實現了上述的GetEnumertor方法
那我們就可以用foreach對類Class1進行枚舉
Class1 c = new Class1;
foreach ( int i in c)
{
Console.WriteLine(i);
}
yield return產生迭代的下一個值,yIEld break說明迭代完成,用迭代器實現就是這麼簡單.
http://www.mscto.com
定義和使用命名迭代器
class Class1
{
public IEnumerator GetEnumerator()
{
for (int i = 0; i < 10; i )
{
yIEld return i;
}
}
// 定義一個命名的迭代器,並可以提供參數
public IEnumerable MaxToMin(int min, int max)
{
for (int i = max; i >= min; i--)
{
yIEld return i;
}
}
// 定義一個迭代器類型的屬性,
public IEnumerable MinToMax
{
// this表示該類實例,因為該類實現了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#(C#培訓 )2.0中引入了一個"不全代碼"的概念,即你可以將一個類的定義放在別的文件中.這樣給大項目,大文件的維護帶來方便.
聲明:
[modifIErs] partial type
modifIEr: [public/private/protected/internal] abstract new override static virtual extern
type:類/結構/接口