2012-01-27 2 views
3

저는 C#의 새로운 기능입니다. 방금 대리인 기능을 연구하려고했습니다. 위임자에 대해 읽은 기사와 노트를 기반으로 필자는 노트와 기사에서 이해 한 것을 토대로 대리인을 구현하는 샘플 코드를 작성하려고했습니다.대리자 이벤트 문제

샘플을 실행하는 동안

하지만 오류를 얻고있다 "개체 참조가 개체의 인스턴스로 설정되지 않았습니다를."

여기에 어떤 문제가 있습니까? 또는 델리게이트를 올바른 방식으로 구현 했습니까? 또는 대리인에 대한 내 개념이 잘못 되었습니까? ...

도와주세요. 미리 감사드립니다.

나는 아래 코드를 게시했다.

하여 default.aspx.cs

public partial class _Default : System.Web.UI.Page 
{ 
    TestClass myObject = new TestClass(); 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     myObject.MyDelegateEvent += new TestClass.MyDelegate(myObject_MyDelegateEvent); 
    } 

    void myObject_MyDelegateEvent(object sender, EventArgs e) 
    { 
     Console.WriteLine("Delegate event called"); 
    } 
} 

TestClass에

public class TestClass 
{ 
    public delegate void MyDelegate(object sender, EventArgs e); 

    public event MyDelegate MyDelegateEvent; 

    public TestClass() 
    {  
     MyDelegateEvent(this, null); // Here getting error "Object reference not set to an instance of an object." 

    } 

} 
+2

생성자에서 이벤트를 발생시킬 수 없습니다. 객체가 생성 될 때까지 * 어떤 코드도 이벤트 처리기를 구독 할 수 없습니다. 이것은 닭고기와 계란 문제입니다. –

답변

6

당신은 무엇을하려고하는 것입니다 : 아니오있을 때 시간에, 즉 생성자 자체에 이벤트를 발생하지 구독자이므로 MyDelegateEvent는 null입니다.

가장 좋은 방법은 이벤트

//Check for not null 
if(MyDelegateEvent != null) 
{ 
    MyDelegateEvent(this, null); 
} 
을 올리기 전에 확인 널 (null)입니다
+1

그리고 물론, 생성자에서하지 마십시오 ... – Oded

1
경우 제기하기 전에 널 (null)에 대한

항상 시험 :이 발생할 때 어떤 핸들러가 이벤트에 연결되지 않은 경우

if (this.MyDelegateEvent != null) 
{ 
    // Raises the event here 
} 

을 (이것은 생성자에서 발생한 것처럼 여기에 있습니다), null 참조 예외가 발생할 수 있습니다.

편집 : 완성도를 위해서, 어떤 이벤트 인수를 사용하지 않을 때, 당신은 EventArgs.Empty 대신 null을 사용해야합니다 경우 :

또한
if (this.MyDelegateEvent != null) 
{ 
    this.MyDelegateEvent(this, EventArgs.Empty); 
} 

, 당신은하지 않을 때 사용할 수있는 EventHandler 대표가 이벤트 인수를 지정하십시오. 이것은 매번 자신 만의 글을 쓸 필요가 없으므로 유용합니다.

1

이벤트를 선언하면 이벤트는 null으로 초기화됩니다. 따라서 TestClass 생성자에서 이벤트를 발생 시키려고 시도하지만 이벤트가 null 일 때 이 표시됩니다.

는 이벤트 핸들러를 등록하거나 이벤트를 발생하기 전에 널 (null)를 확인하기 위해 필요한이를 방지하려면 :

if (MyDelegateEvent != null) 
{ 
    MyDelegateEvent(...) 
} 

또 다른 트릭은 당신이 건너 뛸 수 있습니다 의미를 생성 할 때 빈 대리인에게 이벤트를 초기화하는 것입니다 null 수표

public event MyDelegate MyDelegateEvent = delegate {}; // registers a delegate that does nothing 
0

위의 코드 중 일부에 대한 사소한 점입니다.MyDelegateEvent은 검사 및 사용 사이에서 변경 될 수 있습니다. 추천 양식 (프레임 워크 디자인 가이드 라인)

var del = MyDelegateEvent; 
if (del != null) { 
    del(...); 
} 

HTH,
앨런의 라인을 따라입니다.

+0

나는 그 권고에 정말로 동의하지 않습니다. 이 문제에 대한 전체적인 설명은 http://stackoverflow.com/questions/786383/c-sharp-events-andthread-safety를 참조하십시오. – ken2k

+0

@ ken2k 실을 통해 한 번 봐. 아주 좋아. Null 검사와 상태 검사라는 측면에서 대리자를 호출하는 올바른 방법에 대해 많은 논의가 있습니다. 나는 개인적으로 언급 된 확장 메소드를 좋아하지만, 누군가가 위의 'null check and invoke'메소드를 사용한다면, 경쟁 조건을 점검하지 않아야한다. 경주 수표가 필요 없다고 말한 부분을 놓쳤습니까? – AlanT

+0

Thankx friends .. – Arun

관련 문제