请教大牛们
public event SerialDataReceivedEventHandler DataReceived;

public SerialDataReceivedEventHandler DataReceived;
的区别.Public Event

解决方案 »

  1.   

    不加event的话,你怎么给这个事件指定处理函数呀,例如你的类叫MyClass,如果有event的话,你可以这样写
    MyClass mc=new MyClass();
    mc.DataReceived+=MyClass_DataReceived;public void MyClass_DataReceived()
    {}
    不加event的话,mc.后没有DataReceived,你咋弄?
      

  2.   

    event在编译器上对程序进行了保护。你可以看看哪种垃圾javascript,如果一个代码定义回调函数,但是别的代码可以随时覆盖它。而event在编译器角度保护了你的程序更安全,因为别(定义这个事件的代码它外部的)的代码只能使用 +=、-= 等少数两三个方法,而不能使用 = 等破坏性的代码。
      

  3.   

    public SerialDataReceivedEventHandler DataReceived;定义的是一个委托,而不是事件。你没有办法用+=绑定多个事件处理程序。
      

  4.   

    写 public SerialDataReceivedEventHandler DataReceived; 这样的委托回调是完全可以的!但是你只有在确实必须这样写时才这样写。如果你只想要一个标准的事件,你就得写上event。你要知道,不写 event 丧失了安全性。
      

  5.   

    我给你写一个demousing System;
    using System.Linq;namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                var x = new TA();
                x.Alert = process1;
                x.Alert += process2;
                x.Alert += process3;
                x.callMethod();
                Console.WriteLine("-----------------------");
                var m = (MulticastDelegate)x.Alert;
                x.Alert = (TA.EvtHandler)Delegate.Combine(m.GetInvocationList().Where((p, i) => i % 2 == 0).ToArray());     //只留下奇数个回调
                x.callMethod();
                Console.WriteLine("-----------------------");
                x.Alert = process3;     //彻底重建回调
                x.callMethod();
                Console.ReadKey();
            }        private static void process1()
            {
                Console.WriteLine("process1");
            }        private static void process2()
            {
                Console.WriteLine("process2");
            }        private static void process3()
            {
                Console.WriteLine("process3");
            }    }    public class TA
        {
            public delegate void EvtHandler();        public EvtHandler Alert;        public void callMethod()
            {
                if (Alert != null)
                    Alert();
            }
        }
    }
    你可以看到,在类型TA之外可以随便摧毁 x.Alert 的定义。也许你认为这很“灵活”。但是要知道这不是事件的初衷。我们之所以要使用“事件”来进行设计,就是因为它是安全的,保证不会被各种随意插入的调用x对象的代码按照它自己的想法去相互冲突地去操作x.Alert。
      

  6.   


    我试了下,结合sp1234的代码,我错了。C#可以智能地视为多播委托。
      

  7.   

    搜索 使用event关键字为委托施加保护