24

C# のオブジェクト初期化子でプロパティと共にイベントを割り当てることができないのはなぜですか? そうすることがとても自然に思えます。

var myObject = new MyClass()
     {
        Property = value,
        Event1 = actor,
        // or
        Event2 += actor
     };  

それとも、私が知らないトリックがありますか?

4

3 に答える 3

5

外部コントラクトに関する限り、イベントにはセッターがなくaddremove メソッドのみがあります。サブスクライバーはイベントに登録および登録解除でき、発行オブジェクトはイベントを「発生させる」ことによってコールバックをいつ呼び出すかを決定します。したがって、「イベントを割り当てる」という考えは、一般的には無意味です。

ただし、クラスでイベントを宣言すると、C# コンパイラは本当に便利な機能を提供します。独自の実装を提供しない場合、プライベートを作成し、デリゲート フィールドをバッキングします。適切な追加/削除の実装。これにより、クラス内で「イベントを設定」(実際にはバッキング フィールド) できますが、クラス外ではできません。これを理解するには、次のことを考慮してください。

public class Foo
{
    // implemented by compiler
    public event EventHandler MyEvent;

    public static Foo FooFactory(EventHandler myEventDefault)
    {
       // setting the "event" : perfectly legal
       return new Foo { MyEvent = myEventDefault }; 
    }
}

public class Bar
{
    public static Foo FooFactory(EventHandler myEventDefault)
    {
        // meaningless: won't compile
        return new Foo { MyEvent = myEventDefault };
    }
}


public class Baz
{
    // custom implementation
    public event EventHandler MyEvent
    {      
        add { }  // you can imagine some complex implementation here
        remove { } // and here
    }

    public static Baz BazFactory(EventHandler myEventDefault)
    {
        // also meaningless: won't compile
        return new Baz { MyEvent = myEventDefault };
    }
}
于 2010-10-22T03:59:23.010 に答える
4

+=演算子または-=その所有者クラス外のイベントに対してのみ使用できます。

public class Data
{
    public event EventHandler OnSave = (s,e) => 
        {
            //do something important!
        };

    public void Save()
    {
        OnSave(this,null);
        //do save
    }
}

//outside the class
Data data = new Data { OnSave = null }; //compile error
data.OnSave = SomeMethodElse;  //compile error
data.OnSave += MyCustomActionsOnSave;  //ok
data.Save();

OnSaveクラスで定義されたアクションを削除することはできません。OnSaveクラス外の独自のアクションのみを追加/削除できます。eventキーワードを削除するOnSaveと、 はイベントではなく、通常のデリゲートになります。その後、クラス外で値を割り当てるなど、何でもできます。

于 2010-10-22T03:14:35.633 に答える