델리게이트의 개념을 이해하는 한 간단하게 메소드를 가리 킵니다. 그렇다면 운이 좋으면 나가서 대리인이 가리키는 방법을 호출 할 수 있습니다. 을 감안할 때델리게이트는 함수에 대한 포인터입니까? 또한 변수를 저장합니까?
는 다음과 같은 코드 :
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
에 대한 참조가 저장되어 있으며 함수를 호출 할 때 사용할 수 있습니까? 델리게이트 내부?
참조 : http://stackoverflow.com/questions/428617/what-are-closures-in-net –
나는 주요 문제는 기본 가정이다 생각 대표자가 "방법을 가리킨다"는 것은 지나치게 단순화 된 것이다. 사실 하나의 대리자 인스턴스는 여러 메서드에 대한 참조를 보유 할 수 있습니다. –
또한 클로저 사용의 함정에 유의하십시오. http://msmvps.com/blogs/peterritchie/archive/2010/11/03/deep-dive- on-closure-pitfals.aspx –