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