2013-03-14 81 views
9

那麼我正在通過'Lambda表達式'主題(第17章;代表,代表C#語法糖)。傑弗裏指出,C#編譯器具有以下後臺創建一個新的非靜態類:Lambda表達式:編譯器行爲

  1. 字段來存儲所有已在Lambda表達式被訪問的局部變量。
  2. 一種方法,其主體包含Lambda表達式,其簽名/返回類型與已使用Lambda Expressin的委託相匹配。

我有以下兩個問題:

  1. 我做了一些調試自己,看到的是,如果Lambda表達式修改局部變量的值(在方法定義的拉姆達Expresison正在用於),新的值也反映在表達式體外。考慮到表達式實際上是在不同的類中,這怎麼可能?

  2. 爲什麼發出的類需要非靜態時,靜態類完全可以做到這一點?

我希望這不是一個非常簡單的概念,我無法理解。

讓我知道是否需要提供更多的細節。

回答

5

首先我有一個類似的問題,幾天前。

Closure captured variable modifies the original as well

二,什麼是使其成爲一個靜態類的呢?無論如何只有一個對象被創建,並且該對象不必在整個應用程序生命週期中生存。

the new value is reflected outside the expression body too. How is this possible considering the expression is actually in a different class.

的事情是,同一個對象正在由anonymus方法,還有anonymus法外的局部變量引用的兩個動作,所以它不會從那裏你改變它沒關係,你改變一樣。

此外,Tim Goodman在我鏈接到的問題中提供的答案顯示了您要做什麼,以避免在任何地方反映更改,方法是在anonymus方法內創建一個新對象。

+0

很棒的回答。謝謝。 – astraldust 2013-03-14 10:29:40

+0

不客氣,歡呼聲。 – Freeman 2013-03-14 10:30:11