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屬性,沒有觀察者的其他欄位和方法。