2012-05-22 2 views
1

델리게이트의 개념을 이해하는 한 간단하게 메소드를 가리 킵니다. 그렇다면 운이 좋으면 나가서 대리인이 가리키는 방법을 호출 할 수 있습니다. 을 감안할 때델리게이트는 함수에 대한 포인터입니까? 또한 변수를 저장합니까?

는 다음과 같은 코드 :

class Program 
{ 
    static void Main(string[] args) 
    { 
     Func<MyClass> myAct = GetAct(); 

     Method(myAct); 
    } 

    private static Func<MyClass> GetAct() 
    { 
     MyClass obj = new MyClass() 
     { 
      Prop1 = 5 
     }; 

     Func<MyClass> myAct = new Func<MyClass>(
      () => 
      { 
       MyClass obj2 = new MyClass(); 
       MyClass2 obj3 = new MyClass2() 
       { 
        Prop3 = 25, 
        Prop4 = "test" 
       }; 

       obj2.Prop2 = ((obj.Prop1 + 5) * obj3.Prop3) 
        .ToString() + obj3.Prop4; 

       return obj2; 
      }); 
     return myAct; 
    } 

    static void Method(Delegate func) 
    { 
     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 

     var result = func.DynamicInvoke(); 
    } 
} 

class MyClass 
{ 
    public int Prop1 { get; set; } 
    public string Prop2 { get; set; } 
} 

class MyClass2 
{ 
    public int Prop3 { get; set; } 
    public string Prop4 { get; set; } 
} 

지금 (이 경우 Func<MyClass>에서) 내 대표 myAct 변수의 몇 가지 간단한 대입을 수행하는 익명 함수를 가리키는

. 지금까지 특별한 것은 없습니다.

위임자를 호출합니다.

예상대로 모든 것이 잘되었습니다. 그러나 질문은 그 이유가 무엇입니까? 위임자가 익명 메소드를 가리키고 가비지 콜렉션이 수행 된 경우 CLR은 어쨌든 obj과 그 값을 알 수 있습니까? obj에 대한 참조가 저장되어 있으며 함수를 호출 할 때 사용할 수 있습니까? 델리게이트 내부?

+6

참조 : http://stackoverflow.com/questions/428617/what-are-closures-in-net –

+1

나는 주요 문제는 기본 가정이다 생각 대표자가 "방법을 가리킨다"는 것은 지나치게 단순화 된 것이다. 사실 하나의 대리자 인스턴스는 여러 메서드에 대한 참조를 보유 할 수 있습니다. –

+1

또한 클로저 사용의 함정에 유의하십시오. http://msmvps.com/blogs/peterritchie/archive/2010/11/03/deep-dive- on-closure-pitfals.aspx –

답변

4

익명 방법은 GetAct()의 그래서 CLR이 범위를 익명의 방법을 사용할 수 변수를 만드는 범위 내에서 정의된다.

이는 인스턴스 변수를 멤버 메소드에서 사용할 수있는 것과 비슷합니다. 또한

을 사용하여 폐쇄의 함정을 검토 http://msmvps.com/blogs/peterritchie/archive/2010/11/03/deep-dive-on-closure-pitfals.aspx

+1

검색을 통해 주제에 대한 정보를 얻는 가장 좋은 방법은 아마도 'closure'라는 단어를 대답에 넣어야하는 것입니다. – Servy

+0

@Servy 논평 도난 및 법인. = p – EtherDragon

관련 문제