C# 閉包

Andy Niu發表於2013-09-17

1、解決的問題:

先看例子,

1        private Action CreateFunction()
2         {
3             string str = "I am Andy";
4 
5             return () =>
6                 {
7                     Console.WriteLine(str);
8                 };
9         }
1             Action action = CreateFunction();
2             action();

在委託例項中,訪問str,從作用域來看,沒問題。從生命週期看,方法執行完後,str就會被釋放。理論上講,訪問str會出錯。

補充:堆儲存物件,棧記錄程式執行的過程,方法執行完畢,釋放區域性物件。

2、為了解決上面的問題,編譯器做了手腳,將用到的str儲存到委託物件的Target屬性中,這樣就延長了str的生命週期。

說明:這個Target是方法的擁有者,也就是觀察者,Target中只有str屬性,沒有觀察者的其他欄位和方法。

相關文章