5 5 匿名方法中的捕獲變數

2022-02-21 02:37:40 字數 2908 閱讀 6077

5.5.4 捕獲變數的延長生存期

1

class

program211

static

methodinvoker createinvoker()12;

19ret();

20return

ret;21}

22 }

5.5.5 區域性變數例項化

使用多個委託來捕捉多個變數例項

1

class

program2);

14}1516 console.writeline("

list********************==");

17foreach (var item in

list)

1821

22 console.writeline("

list[0]********************==");

23 list[0

]();

24 list[0

]();

25 list[0

]();

2627 console.writeline("

list[1]********************==");

28 list[1

]();

2930

console.readkey();

3132

/*33

list********************==340

3510

3620

3730

3840

39list[0]********************==401

412423

43list[1]********************==

4411

45*/46}

47 }

由迴圈的初始部分宣告的變數只被例項化一次。這很容易弄錯!

如果你想捕獲迴圈變數在一次特定的迴圈迭代中的值,必須在迴圈內部引入另乙個變數,

並將迴圈變數的值複製給它,再捕捉那個新變數

5.5.6 共享和非共享的變數混合使用

1

class

program2

", outside, inside);

15 outside++;

16 inside++;

17};18}

1920 methodinvoker first = delegates[0

];21

22 methodinvoker second = delegates[1

];23

24first();

25first();

26first();

2728 console.writeline("

***************====");

2930

second();

31second();

3233

console.readkey();

3435

/*36

0 037

1 138

2 239

***************====

403 0

414 1

42*/43}

44 }

5.5.7 捕獲變數的使用規則和小結

使用捕獲變數時,請參照以下規則。

 如果用或不用捕獲變數時的**同樣簡單,那就不要用。

 捕獲由 for 或 foreach 語句宣告的變數之前,思考你的委託是否需要在迴圈迭代結束之後

延續,以及是否想讓它看到那個變數的後續值。如果不是,就在迴圈內另建乙個變數,

用來複製你想要的值。(在c# 5中,你不必擔心 foreach 語句,但仍需小心 for 語句。)

 如果建立多個委託例項(不管是在迴圈內,還是顯式地建立),而且捕獲了變數,思考一

下是否希望它們捕捉同乙個變數。

 如果捕捉的變數不會發生改變(不管是在匿名方法中,還是在包圍著匿名方法的外層方

法主體中),就不需要有這麼多擔心。

 如果你建立的委託例項永遠不從方法中「逃脫」,換言之,它們永遠不會儲存到別的地方,

不會返回,也不會用於啟動執行緒——那麼事情就會簡單得多。

 從垃圾**的角度,思考任何捕獲變數被延長的生存期。這方面的問題一般都不大,但

假如捕獲的物件會產生昂貴的記憶體開銷,問題就會凸現出來。

第一條規則可奉為金科玉律。簡化總是好事。所以在任何時候,如果使用乙個捕獲的變數

能使**變得更簡單(前提是你已將強迫**維護人員理解捕獲的變數所做的事情這一額外復

雜性考慮在內),那麼就用它。但你也要考慮它所帶來的額外的複雜度,不要一味地追求最少

的**量。

列出了一些要記住的重要知識點,

 1 捕獲的是變數,而不是建立委託例項時它的值。

 2 捕獲的變數的生存期被延長了,至少和捕捉它的委託一樣長。

 3 多個委託可以捕獲同乙個變數……

 4 ……但在迴圈內部,同乙個變數宣告實際上會引用不同的變數「例項」。

 5 在 for 迴圈的宣告中建立的變數

 6 必要時建立額外的型別來儲存捕獲變數。

 7 要小心!簡單幾乎總是比耍小聰明好。

MySql中捕獲異常的方法

mysql中是否能有sqlserver的 error變數呢,或者如c 中的try catch語法呢。答案是肯定的,例項 如下 drop procedure ifexists sp call jobs create procedure sp call jobs notdeterministic sql...

MySql中捕獲異常的方法

mysql中是否能有sqlserver的 error變數呢,或者如c 中的try catch語法呢。答案是肯定的,例項 如下 code drop procedure ifexists sp call jobs create procedure sp call jobs notdeterministi...

Objective C 方法與成員變數 匿名物件

方法與成員變數 人類名 person 屬性 成員變數 例項變數 體重 年齡 行為 方法 走路 吃 1.類的宣告 成員變數 方法的宣告 2.類的實現 import 1.類的宣告 inte ce person nsobject void walk void eat end 2.類的實現 implemen...