2010-11-30 3 views
1

나는 expression-builder 패턴을 사용하여 객체를 만듭니다. 표현식 작성기가 오브젝트에서 구성하는 것 중 하나는 이벤트 핸들러입니다. 내가 좋아하는 것이 무엇하나의 델리게이트에서 다른 델리게이트로 호출 목록 복사

public class TargetObject 
    { 
     public event Action SomeEvent; 
    } 

    public class ObjectBuilder 
    { 
     private Action handler; 

     public TargetObject GetObject() 
     { 
      TargetObject target = new TargetObject(); 
      target.SomeEvent += handler; 

      return target; 
     } 

     public ObjectBuilder AddHandler(Action handler) 
     { 
      this.handler += handler; 
      return this; 
     } 
    } 

오히려 쓰기보다는이다 :

this.handler += handler; 

가, ObjectBuilder에서 "처리기"회원에 의해 캡슐화 호출 목록을 전송하려면 "다음은 몇 가지 실증 의사 코드는 SomeEvent "를 목표로합니다. 그렇지 않으면 내 TargetObject의 "SomeEvent"가 ObjectBuilder의 "handler"에 대한 참조를 보유하기 때문에 ObjectBuilder에서 가비지 수집되지 않습니다.

이것이 가능합니까?

편집 :

class Program 
    { 
     static void Main(string[] args) 
     { 
      TargetObject target = new ObjectBuilder() 
       .AddHandler(DoSomething) 
       .GetObject(); 
     } 

     private static void DoSomething() 
     { 
     } 
    } 
+0

두 개체가 같은 유형입니까? –

+0

두 개의 개체 ?? – joniba

+0

대리자는 변경할 수없는 참조 유형입니다. 반환 된'TargetObject'는 GCed에서 생성 된'ObjectBuilder' 인스턴스를 막지 않습니다. 'handler' 필드는 힙의 다른 위임 * 인스턴스에 대한 * 참조를 보유합니다. 이 참조는'target.SomeEvent + = handler;를 할 때 * copying *됩니다. 즉,'target'은이'ObjectBuilder'에 대해 전혀 알지 못하며 직접적으로 또는 참조를 보유하지 않습니다 이벤트 핸들러의 (아마) delegate-field. – Ani

답변

0

당신에게 TargetObject의 인스턴스가 "처리기"필드를 잡고 있기 때문에 ObjectBuilder가-에드 GC 있지 않은지 위치 : 요청 으로, 여기에 이러한 클래스를 소비하는 몇 가지 예제 코드는? delegate가 불변 인 경우, this.handler + = 핸들러는 새로운 Action 인스턴스를 작성합니다.

+0

Ani 님의 댓글에 대한 답변으로 마지막 댓글을 참조하십시오. 새 위임 인스턴스가 만들어졌지만이 새 인스턴스는 ObjectBuilder 인스턴스의 멤버를 참조하는 것이 옳습니다. – joniba

+0

@ joniba : 테스트 앱을 작성했으며 메모리 프로파일 러를 사용하여 누수를 찾을 수 없습니다. –

관련 문제