代码之家  ›  专栏  ›  技术社区  ›  Max

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

  •  20
  • Max  · 技术社区  · 14 年前

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

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

    还是有什么我不知道的把戏?

    3 回复  |  直到 7 年前
        1
  •  6
  •   Ani    14 年前

    就外部合同而言,事件没有设定者,只有 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 };
        }
    }
    
        2
  •  3
  •   Cheng Chen    14 年前

    你只能用 += -+ 对其所有者类之外的事件的运算符。

    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 类中定义的操作。您只能添加/删除自己的 省钱 类外的操作。如果你移除 event 关键字, 省钱 将不再是一个事件,而是一个普通的代表。然后您可以做任何事情,包括在类外部分配值。

        3
  •  3
  •   Drew Noakes    7 年前

    这并没有使C 6或C 7(从最初的问题开始),但还没有决定反对。GitHub上有一个跟踪语言建议的问题。你可以在那里投票,也可以通过链接进入之前关于这个特性的讨论。

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

    如果您想查看此功能,请在问题上添加一个拇指,以帮助提高其可见性。

    建议的语法是:

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