1

정확히 무슨 일이 벌어지는지는 모르지만 .NET 1.1 에서처럼 초기화되지 않은 이벤트 대리자는 문제없이 실행할 수 있지만 .NET 2.0 이상에서는 NullReferenceException이 발생합니다 . 왜 어떤 아이디어. 아래의 코드는 1.1에서는 문제없이 잘 실행되지만, 2.0에서는 NullReferenceException을 제공합니다. 나는 그것이 왜 다르게 행동하는지 궁금하다. 무엇이 바뀌 었습니까?이벤트 처리기 동작 차이 .net 1.1 대 null 위임을 포함한 2.0

감사

class Class1 
    { 
    public delegate void ChartJoinedRowAddedHandler(object sender); 



    public static event ChartJoinedRowAddedHandler ChartJoinedRowAdded; 
    public static DataTable dt; 

    public static void Main() 
    {   
     dt = new DataTable(); 
     dt.RowChanged += new DataRowChangeEventHandler(TableEventHandler); 

     object [] obj = new object[]{1,2}; 
     dt.Columns.Add("Name"); 
     dt.Columns.Add("Last"); 
     dt.NewRow(); 
     dt.Rows.Add(obj); 
    } 

    private static void TableEventHandler(object sender, DataRowChangeEventArgs e) 
    { 
     ChartJoinedRowAdded(new object()); 
    } 
} 

답변

1

[업데이트] AFAIK, 기본 대리자 처리하기 위해 여기에는 변화가 없었다; 차이점은 DataTable의 작동 방식에 있습니다.

그러나! 정적 이벤트를 사용하여 특히 인스턴스에서 구독하는 경우 (정적 메서드가 아닌) 특히주의하십시오. 이것은 객체의 거대한 경계를 살아있게 유지하고 가비지 수집하지 않는 좋은 방법입니다.

1.1에서 csc를 통해 코드를 실행하면 일반 위임 측이 동일하다는 것을 알 수 있습니다. 차이점은 RowChanged를 발생시키는 DataTable 코드가 예외를 삼키는 것입니다. 예를 들어, 아래 코드를 작성하십시오.

"Before"는 표시되지만 "After"는 표시되지 않습니다. 예외가 발생하여 DataTable에 의해 삼켰습니다.

1

이벤트 핸들러 시스템은 기본적으로 주어진 이벤트가 발생할 때 호출 할 함수 목록 일뿐입니다.

당신이 비록 2

에 이벤트가 작동하는 방법은 정말 1.1에서 변경되지 않았습니다

if (ChartJoinedRowAdded != null) 
     ChartJoinedRowAdded(new object()) 
0

을 할 필요가 그래서, 빈리스트를 "널 (null)"목록에 초기화하고,하지 구문은 정상 집단처럼 보이는 정말되지 않습니다 :

dt.RowChanged += TableEventHandler; 
dt.RowChanged += null; 
dt.RowChanged += delegate (object sender, DataRowChangeEventArgs e) { 
    //anon 
}; 

는 다음 대리자를 TableEventHandler 화재와 윌 - 널 생략 단지입니다.

이벤트를 취소 null을 사용하지만, 단지 이벤트 발사 클래스 내 수

this.MyEvent = null; 

아무것도 이벤트가 null이됩니다 구독하지 않는 경우는 - soraz의 답변을 참조하십시오. DataTable 클래스는 비슷한 수표를 포함하며 구독자가없는 경우 이벤트를 실행하지 않습니다.

표준 패턴은 다음과 같습니다

//events should just about always use this pattern: object, args 
public static event EventHandler<MyEventArgs> ChartJoinedRowAdded; 


//inheriting classes can override this event behaviour 
protected virtual OnChartJoinedRowAdded() { 
    if(ChartJoinedRowAdded != null) 
     ChartJoinedRowAdded(this, new MyEventArgs(...)); 
}