整理 C 2 0特性之匿名方法和迭代器

2022-02-26 16:52:09 字數 2907 閱讀 4471

匿名方法的由來

我們在這裡用事件的定義來舉例,沒有匿名方法的時候

public

partial

class

_default : system.web.ui.page

protected

void

addclick(

object

sender, eventargs e)

}有了匿名方法以後

public

partial

class

_default : system.web.ui.page;}

}匿名方法的簡介

1.匿名方法允許我們以一種"內聯"的方式編寫方法**,將**直接與委託例項相關聯,從而使得委託例項化的工作變得更加直觀和方便

2.匿名方法的幾個相關問題

-匿名方法的引數

a.匿名方法可以在delegate關鍵字後跟乙個引數列表(如果方法體沒用到引數可以不指定),後面的**塊則可以訪問這些引數。

b.引數列表必須與使用匿名方法的委託的引數列表完全相同。

帶引數的匿名方法

public

partial

class

_default : system.web.ui.page;//

如果方法體中沒有用到引數列表的引數的話,一般省略不寫,如下:

addbutton.click 

+=delegate;//

下面的寫法是錯誤的,除非委託本身沒有引數列表

addbutton.click 

+=delegate();

}}-匿名方法的返回值

a.如果委託型別的返回值為void,那麼匿名方法就不能有返回值

b.如果委託型別的返回值不為void,那麼匿名方法的返回值就必須與委託型別的返回值型別一致。

如下示例

delegate void mydelegate();

mydelegate g = delegate

delegate int mydelegate();

mydelegate g= delegate

-外部變數

a.一些區域性變數和引數有可能被匿名方法所使用,它們被稱為"匿名方法的外部變數"。

b.外部變數的生存期會由於匿名方法"捕獲效應"而延長,一直延長到委託例項不被引用為止。

delegate

double

function();

static

void

customfunction(

double

data);}

委託型別的推斷

1.c#2.0允許我們在進行委託例項化時,省略掉委託型別,而直接採用方法名,c#編譯器會做合理的推斷

2.由於c#2.0有了委託型別推斷功能,所以2.0針對1.0有如下改變

在1.0中

addbutton.click += new eventhanddler(addclick);

在2.0中

addbutton.click += addclick;

匿名方法機制

1.c#2.0中的匿名方法僅僅是通過編譯器的一層而外處理,來簡化委託例項化的工作。它與以前版本不存在根本性的差別。

2.深入了解匿名方法機制

-靜態方法中的匿名方法

public delegate void d();

static void f()

}上面的**將被編譯器轉換為如下**

static void f()

static void _method1()

-例項化方法中的匿名方法

class test;}

}上面的**被編譯器轉換為

void f()

void _method1()

-匿名方法中的外部變數

void f();}

上面的**被編譯器轉換為

class _temp

}void f()

迭代器

在沒有迭代器之前,建立乙個可用於foreach的集合,如下做法

2.0以前版本實現可foreach的集合

public

class

mycollections : ienumerable

public

class

myenumerator : ienumerator

public

bool

movenext()

public

intcurrent

}object

ienumerator.current}}

}c#2.0中使用迭代器定義可foreach的集合

用迭代器生成可foreach的集合

public

class

stack : ienumerable

;public

ienumerator getenumerator()}}

用迭代器生成可foreach的集合(含中斷迭代)

public

class

stack : ienumerable

;public

ienumerator getenumerator()

yield

return

item[i];}}

}測試例項

public

partial

class

demo1 : system.web.ui.page}}

注意上圖中含有yield break;語句的測試結果為

4,1

第1節 C 2 0新特性之四 迭代器

迭代器 迭代器是一種方法 get訪問器或運算子,它通過使用 yield 關鍵字對陣列或集合類執行自定義迭代。yield 返回語句會導致源序列中的元素在訪問源序列中的下乙個元素之前立即返回給呼叫方。儘管您以方法的形式編寫迭代器,但編譯器會將其轉換為乙個實際上是狀態機的巢狀類。只要客戶端 中的 fore...

C 2 0和3 0主要的新特性

c 2.0和3.0主要新特性 c 2.0新特性 c 2.0 引入了很多語言擴充套件,最重要的就是泛型 generics 匿名方法 anonymous methods 迭代器 iterators 和不完全型別 partial types 一 泛型 泛型是2.0 版c 語言和公共語言執行庫 clr 中的...

C 2 0類和物件學習系列之get,set訪問器

屬性的get訪問器有乙個約束是必須返回乙個與屬型別相同的物件 或相同型別物件的引用,假如這是乙個引用型別的話 它表示對屬性賦值所提供的物件 或引用 屬性也不必實現set訪問器,這樣的屬性稱為唯讀屬性 public class foo class program 在set訪問器的 中引數value是乙...