1

ここで何が起こっているのか正確にはわかりませんが、.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());
    }
}
4

3 に答える 3

1

[更新] 私の知る限り、ここでは基本的なデリゲート処理に変更はありませんでした。違いは、DataTable の動作です。

でも!(静的メソッドではなく) インスタンスからサブスクライブしている場合は特に、静的イベントの使用には十分注意してください。これは、大量のオブジェクトを存続させ、ガベージ コレクションを行わないようにするための良い方法です。

1.1 から csc を介してコードを実行すると、一般的なデリゲート側が同じであることがわかります。違いは、RowChanged を発生させる DataTable コードが例外を飲み込んでいたことだと思います。たとえば、次のようなコードを作成します。

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

「前」は表示されますが、「後」は表示されません。例外がスローされ、DataTable によって飲み込まれました。

于 2008-10-08T08:11:33.247 に答える
1

イベントハンドラ システムは基本的に、特定のイベントが発生したときに呼び出す関数のリストにすぎません。

空のリストではなく「null」リストに初期化されるため、次のことを行う必要があります

if (ChartJoinedRowAdded != null)
      ChartJoinedRowAdded(new object())
于 2008-10-08T08:29:41.323 に答える
0

イベントの仕組みは 1.1 から 2 までほとんど変わっていません

構文は通常の集計のように見えますが、実際にはそうではありません。

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

デリゲートが起動TableEventHandlerし、null がスキップされます。

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(...) );
}
于 2008-10-08T09:55:13.583 に答える