Frage

Nicht sicher, was genau hier vor sich geht, aber scheint, wie in .NET 1.1 eine nicht initialisierte Ereignisdelegaten ohne Probleme laufen können, aber in .NET 2.0+ es verursacht eine Nullreferenceexception. Irgendwelche Ideen, warum. Der folgende Code wird gut laufen ohne Probleme in 1.1 in 2.0 es eine Nullreferenceexception gibt. Ich bin neugierig, warum es anders verhält? Was hat sich geändert?

Danke

zB

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());
    }
}
War es hilfreich?

Lösung

[aktualisiert] AFAIK, es gab keine Änderung hier auf die Grund delegieren Handhabung; der Unterschied liegt darin, wie Datatable verhält.

Allerdings! Seien Sie sehr vorsichtig statische Ereignisse mit, vor allem, wenn Sie von Instanzen abonnieren (eher als statische Methoden). Dies ist ein guter Weg, um große Schwaden von Objekten am Leben zu halten und nicht Müll gesammelt.

Ausführen den Codes über csc von 1,1 zeigt, dass die allgemeinen Delegierten Seite das gleiche ist - ich denke, der Unterschied ist, dass der Datatable-Code, die RowChanged wirft die Ausnahme schluckt. Zum Beispiel machen Sie den Code wie folgt:

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

Sie werden sehen, „Vor“, aber keine „After“; Eine Ausnahme wurde von der Datatable geworfen und geschluckt.

Andere Tipps

Das Eventhandler-System ist im Grunde nur eine Liste von Funktionen aufzurufen, wenn ein bestimmtes Ereignis ausgelöst wird.

Es initialisiert auf die „Null“ -Liste, und nicht die leere Liste, so müssen Sie tun

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

Die Art und Weise Ereignisse Arbeit hat sich nicht wirklich verändert 1,1-2

Obwohl die Syntax wie normale Aggregation sieht ist es wirklich nicht:

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

Wird TableEventHandler Feuer und dann die Delegierten - die Null wird übersprungen nur

.

Sie können null verwenden, um Ereignisse zu löschen, aber nur innerhalb der Veranstaltung Brennklasse:

this.MyEvent = null;

Wenn nichts abonniert Ihre Veranstaltung null sein wird - Soraz Antwort sehen. Die DataTable Klasse wird eine ähnliche Prüfung enthalten und wird das Ereignis nicht ausgelöst, wenn es keine Abonnenten.

Das Standardmuster ist:

//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(...) );
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top