C# のオブジェクト初期化子でプロパティと共にイベントを割り当てることができないのはなぜですか? そうすることがとても自然に思えます。
var myObject = new MyClass()
{
Property = value,
Event1 = actor,
// or
Event2 += actor
};
それとも、私が知らないトリックがありますか?
C# のオブジェクト初期化子でプロパティと共にイベントを割り当てることができないのはなぜですか? そうすることがとても自然に思えます。
var myObject = new MyClass()
{
Property = value,
Event1 = actor,
// or
Event2 += actor
};
それとも、私が知らないトリックがありますか?
外部コントラクトに関する限り、イベントにはセッターがなくadd
、remove
メソッドのみがあります。サブスクライバーはイベントに登録および登録解除でき、発行オブジェクトはイベントを「発生させる」ことによってコールバックをいつ呼び出すかを決定します。したがって、「イベントを割り当てる」という考えは、一般的には無意味です。
ただし、クラスでイベントを宣言すると、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 };
}
}
+=
演算子または-=
その所有者クラス外のイベントに対してのみ使用できます。
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
と、 はイベントではなく、通常のデリゲートになります。その後、クラス外で値を割り当てるなど、何でもできます。