2012-10-19 16 views

Odpowiedz

7

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".

+0

Warto również sprawdzić: http://blogs.msdn.com/b/matt/archive/2008/03/01/understanding-variable-capturing-in-c.aspx – pencilCake