문제

여기서 정확히 무슨 일이 일어나고 있는지 확실하지 않지만 .NET 1.1에서는 비리형 이벤트 대의원이 문제없이 실행될 수 있지만 .NET 2.0+에서는 NullReferenceException을 유발합니다. 왜 모든 아이디어. 아래 코드는 1.1의 문제없이 정상으로 실행되며 2.0으로 NullReferenceException이 제공됩니다. 왜 다르게 행동합니까? 무엇이 바뀌 었습니까?

감사

예를 들어

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());
    }
}
도움이 되었습니까?

해결책

업데이트 된] Afaik, 기본 대의원 취급에 변화가 없었습니다. 차이점은 DataTable의 동작 방식에 있습니다.

하지만! 정적 이벤트, 특히 정적 방법이 아닌 인스턴스에서 구독하는 경우 정적 이벤트를 매우 조심하십시오. 이것은 거대한 물건을 살아 있고 쓰레기를 수집하지 않는 좋은 방법입니다.

1.1에서 CSC를 통해 코드를 실행하면 일반 대의원 측이 동일하다는 것을 보여줍니다. 차이점은 Rowchanged를 올리는 데이터 가능한 코드가 예외를 삼키고 있다고 생각합니다. 예를 들어, 아래와 같이 코드를 만듭니다.

    Console.WriteLine("Before");
    ChartJoinedRowAdded(new object());
    Console.WriteLine("After");

당신은 "이전"이지만 "이후"를 볼 수 없습니다. 데이터 가능에 의해 예외가 발생하고 삼켰습니다.

다른 팁

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

빈 목록이 아닌 "null"목록으로 초기화하므로해야합니다.

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

이벤트 작동 방식은 실제로 1.1에서 2로 변하지 않았습니다.

구문은 정상 집계처럼 보이지만 실제로는 그렇지 않습니다.

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(...) );
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top