W "Zmiennych wychwyconych" sposób przechwytywania zmiennej?Przechwycone zmienne ... Co właściwie oznacza "Captured"?
Co oznacza termin "schwytany"?
Czy oznacza to odniesienie do typu wartości bez udziału boksu?
Dzięki
W "Zmiennych wychwyconych" sposób przechwytywania zmiennej?Przechwycone zmienne ... Co właściwie oznacza "Captured"?
Co oznacza termin "schwytany"?
Czy oznacza to odniesienie do typu wartości bez udziału boksu?
Dzięki
Zarejestrowane zmienne zazwyczaj odnosi się do zmiennej zrobione z zamknięciem (głównie funkcji inline). "Przechwytywanie" oznacza, że funkcja inline musi "przechwytywać" odniesienie do zmiennej w funkcji zewnętrznej. Aby to zrobić, kompilator C# generuje klasę wewnętrzną i przekazuje zewnętrzną zmienną przez odwołanie do klasy wewnętrznej (do której następnie odwołuje się funkcja inline). Możesz to zobaczyć, jeśli zdemontujesz swój kod.
Rozważmy następujący
void Main()
{
string s = "hello";
Action a = delegate
{
Debug.WriteLine(s);
};
s = "hello2";
a();
}
w powyższym przykładzie, ciąg zmienna y jest opanowana przez inline akcji.
Pod maską kompilator C# utworzy klasę wewnętrzną, której Action odwołuje się do przechwytywania wartości zmiennej s. Ważne jest, aby zauważyć, że ciąg s jest przekazywany przez odniesienie do Akcji a, więc akcja faktycznie wydrukuje "hello2", a nie "cześć". Może to spowodować niezamierzone skutki uboczne, jeśli nie zostanie zrozumiane wyraźnie i jest określane jako "dostęp do zmodyfikowanego zamknięcia".
Warto również sprawdzić: http://blogs.msdn.com/b/matt/archive/2008/03/01/understanding-variable-capturing-in-c.aspx – pencilCake