日期:2014-05-17  浏览次数:20867 次

请教大牛们event关键字的问题
请教大牛们
public event SerialDataReceivedEventHandler DataReceived;

public SerialDataReceivedEventHandler DataReceived;
的区别.
Public?Event

------解决方案--------------------
不加event的话,你怎么给这个事件指定处理函数呀,例如你的类叫MyClass,如果有event的话,你可以这样写

MyClass mc=new MyClass();
mc.DataReceived+=MyClass_DataReceived;

public void MyClass_DataReceived()
{

}


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

定义的是一个委托,而不是事件。你没有办法用+=绑定多个事件处理程序。
------解决方案--------------------
写 public SerialDataReceivedEventHandler DataReceived; 这样的委托回调是完全可以的!

但是你只有在确实必须这样写时才这样写。如果你只想要一个标准的事件,你就得写上event。你要知道,不写 event 丧失了安全性。
------解决方案--------------------
我给你写一个demo
using 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;