在对象初始值设定项中分配事件

为什么不能在C#中的对象初始值设定项中分配事件和属性? 这样做似乎很自然。

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

还是有一些我不知道的技巧?

就外部合同而言,事件没有setter,只有addremove 方法 – 订阅者可以注册和取消注册事件, 发布对象决定何时通过“提升”事件来调用回调。 因此,一般来说,“分配事件”的想法毫无意义。

但是,当您在类中声明一个事件时,C#编译器会为您提供真正方便的function:当您不提供自己的实现时,它会为您创建一个私有的支持委托字段,以及适当的添加/删除实现。 这允许您在类中“设置事件”(实际上是支持字段),但不在其外部。 要理解这一点,请考虑:

 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将不再是一个事件,而是一个普通的委托。 然后你可以做任何事情,包括在课外分配价值。

这不是C#6或C#7(自原始问题以来),但尚未决定反对。 GitHub上存在跟踪语言提案的问题。 您可以在那里投票,并按照之前关于该function的讨论的链接。

https://github.com/dotnet/csharplang/issues/307

如果您希望看到此function,请对问题添加一个竖起大拇指以帮助提高其可见性。

建议的语法是:

 var timer = new DispatcherTimer { Tick += delegate {}, Interval = TimeSpan.FromSeconds(1d), };