事件基于多播委托的特性。

  多播委托事实上就是一组类型安全的函数指针管理器,调用则执行顺序跳转到数组里所有的函数指针里执行。

    class Program
{
public class CarInfoEventArgs : EventArgs
{
public string Car { get; set; } public CarInfoEventArgs(string car)
{
this.Car = car;
}
} public class CarDealer
{
public event EventHandler<CarInfoEventArgs> NewCarInfo; //使用系统定义的泛型委托 public void NewCarcComing(string car)
{
Console.WriteLine("CarDealer, new car {0} has come.", car); EventHandler<CarInfoEventArgs> newCarInfo = NewCarInfo;
if (newCarInfo != null)
NewCarInfo(this, new CarInfoEventArgs(car));
}
} public class Consumer
{
private string name; public Consumer(string name)
{
this.name = name;
} public void NewCarIsHere(object sender, CarInfoEventArgs e)
{
Console.WriteLine("{0}, car {1} is new", name, e.Car);
}
} static void Main(string[] args)
{
var dealer = new CarDealer();
var personA = new Consumer("personA");
dealer.NewCarInfo += personA.NewCarIsHere;
dealer.NewCarcComing("Ferrari"); var personB = new Consumer("personB");
dealer.NewCarInfo += personB.NewCarIsHere;
dealer.NewCarcComing("BMW"); Console.ReadLine();
}
}

  

  基于该例,我们用“多播委托”的概念来重写:

    class Program
{
public class CarDealer
{
public Action<string> NewCarInfo; //使用系统定义的泛型委托 public void NewCarComing(string car)
{
Console.WriteLine("CarDealer, new car {0} has come.", car); if (NewCarInfo != null)
NewCarInfo(car);
}
} public class Consumer
{
private string name; public Consumer(string name)
{
this.name = name;
} public void NewCarIsHere(string car)
{
Console.WriteLine("{0}, car {1} is new", name, car);
}
} static void Main(string[] args)
{
var dealer = new CarDealer();
var personA = new Consumer("personA");
dealer.NewCarInfo += personA.NewCarIsHere;
dealer.NewCarComing("Ferrari"); var personB = new Consumer("personB");
dealer.NewCarInfo += personB.NewCarIsHere;
dealer.NewCarComing("BMW"); Console.ReadLine();
}
}

  我只想知道,在多播委托的基础上,事件有哪些自身的特性?从以上两个例子中似乎看不出来。

  继续来看下一个例子:

    class Program
{
public class CarDealer
{
public event Action<string> NewCarInfo; //使用系统定义的泛型委托 public void NewCarComing(string car)
{
Console.WriteLine("CarDealer, new car {0} has come.", car); if (NewCarInfo != null)
NewCarInfo(car);
}
} public class Consumer
{
private string name; public Consumer(string name)
{
this.name = name;
} public void NewCarIsHere(string car)
{
Console.WriteLine("{0}, car {1} is new", name, car);
}
} static void Main(string[] args)
{
var dealer = new CarDealer();
var personA = new Consumer("personA");
dealer.NewCarInfo += personA.NewCarIsHere;
dealer.NewCarInfo("Ferrari"); var personB = new Consumer("personB");
dealer.NewCarInfo += personB.NewCarIsHere;
dealer.NewCarInfo("BMW"); Console.ReadLine();
}
}

  1. 我们在委托之前加上“event”关键字;

  2. 我们在外部直接调用 委托实例;

  这个例子是编译不过的,由此可知 “event” 是不能直接由外部访问的。将该实例的 “event” 关键字拿掉,则可以编译通过。

 

    class Program
{
public class CarDealer
{
public event Action<string> NewCarInfo; //使用系统定义的泛型委托 public void NewCarComing(string car)
{
Console.WriteLine("CarDealer, new car {0} has come.", car); if (NewCarInfo != null)
NewCarInfo(car);
}
} public class Consumer
{
private string name; public Consumer(string name)
{
this.name = name;
} public void NewCarIsHere(string car)
{
Console.WriteLine("{0}, car {1} is new", name, car);
}
} static void Main(string[] args)
{
var dealer = new CarDealer();
var personA = new Consumer("personA");
dealer.NewCarInfo += personA.NewCarIsHere;
dealer.NewCarComing("Ferrari"); var personB = new Consumer("personB");
dealer.NewCarInfo += personB.NewCarIsHere;
dealer.NewCarComing("BMW"); Console.ReadLine();
}
}

  将         dealer.NewCarInfo("BMW");

改为了   dealer.NewCarComing("BMW");

  则可以编译通过,说明:委托实例是可以直接调用委托方法的,而事件则需要进一步封装,由此可知,事件是将委托方法私有化的封装

  再通过 反编译器 检查exe:

  可以看到,增加了 add_NewCarInfo, remove_NewCarInfo 两个方法,则进一步证明了我们对事件的定义:编译器生成了两个公有方法,来解决私有化委托后,外部无法为其增加或减少委托方法的问题

C# 基于委托的事件的更多相关文章

  1. .NET面试题系列[7] - 委托与事件

    委托和事件 委托在C#中具有无比重要的地位. C#中的委托可以说俯拾即是,从LINQ中的lambda表达式到(包括但不限于)winform,wpf中的各种事件都有着委托的身影.C#中如果没有了事件,那 ...

  2. .NET基础拾遗(4)委托、事件、反射与特性

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

  3. [转载]C#委托和事件(Delegate、Event、EventHandler、EventArgs)

    原文链接:http://blog.csdn.net/zwj7612356/article/details/8272520 14.1.委托 当要把方法作为实参传送给其他方法的形参时,形参需要使用委托.委 ...

  4. C# 委托和事件(一):最简单的委托和事件

    C#的事件基于委托,所以先说委托. 一切脱离实际场景的抽象概念新手看上去就像是在扯犊子,不错,我就是个新手.所以我需要一个实际的场景. 明天刚好考试(商务英语),考试上有两个角色(class):老师( ...

  5. c#中委托和事件(续)(转)

    本文将讨论委托和事件一些更为细节的问题,包括一些大家常问到的问题,以及事件访问器.异常处理.超时处理和异步方法调用等内容. 为什么要使用事件而不是委托变量? 在 C#中的委托和事件 中,我提出了两个为 ...

  6. 第一章、C#委托和事件(Delegate、Event、EventHandler、EventArgs)

    第一章.C#委托和事件(Delegate.Event.EventHandler.EventArgs) 分类: 学习笔记-C#网络编程2012-12-08 14:10 7417人阅读 评论(3) 收藏  ...

  7. c#委托和事件(下) 分类: C# 2015-03-09 08:42 211人阅读 评论(0) 收藏

    C#中的委托和事件(下) 引言 如果你看过了 C#中的委托和事件 一文,我想你对委托和事件已经有了一个基本的认识.但那些远不是委托和事件的全部内容,还有很多的地方没有涉及.本文将讨论委托和事件一些更为 ...

  8. C#中委托和事件

    目 录 将方法作为方法的参数 将方法绑定到委托 更好的封装性 限制类型能力 范例说明 Observer 设计模式简介 实现范例的Observer 设计模式 .NET 框架中的委托与事件 为什么委托定义 ...

  9. C#委托和事件?策略模式?接口回调?还不清楚的赶紧来看我扯

    早前学习委托的时候,写过一点东西,今天带着新的思考和认知,再记点东西.这篇文章扯到设计模式中的策略模式,观察者模式,还有.NET的特性之一--委托.真的,请相信我,我只是在扯淡...... 场景练习 ...

随机推荐

  1. SRM 397(1-250pt)

    题意:对于一个长度n的数列(由1-n组成,n <= 8),每次操作可以reverse k个连续的数.问最少多少次操作可以将该数列转化成递增的数列. 解法:就是一个BFS.只是由于最开始学习BFS ...

  2. SRM 401(1-250pt, 1-500pt)

    DIV1 250pt 题意:给一个整数f,则这样的正整数整数数列称为好数列:数列元素a0 >= a1 >= a2...,且a0<= f, a1 <= f-1, a2 <= ...

  3. ASIHttpRequest或者SDWebImage给UIImageView加载图片的逻辑是什么样子的

    非常非常喜欢SDWebImage,就算后来AF也做了图片缓存,我也还是一直使用.图片缓存真的是一件令人头疼的事,但是SDWebImage封装了一切,你所需要的只是简单的set一个URL:1.设置一个展 ...

  4. Java 单元测试Junit

    @Test @Before @After 测试方法运行前执行Before动作(比如创建资源),运行后执行After动作(比如销毁资源) @BeforeClass @AfterClass 测试类运行前执 ...

  5. 二维码开源库zbar、zxing使用心得

    首先说明我的测试场景是“识别打印在纸上的二维码”,在扫描结果中寻找二维码并进行识别,而不是直接让摄像头对着二维码扫描. zbar和zxing用的都是自己从github上clone的c++源码/接口编译 ...

  6. struts2入门程序

    struts2入门程序 1.示例 搭建编程环境就先不说了,这里假设已经搭建好了编程环境,并且下好了strut2的jar包,接下来程序. 1.1 新建web项目 点击File->New->D ...

  7. 九度OnlineJudge之1001:A+B for Matrices

    题目描述: This time, you are supposed to find A+B where A and B are two matrices, and then count the num ...

  8. hdu 3642 Get The Treasury(扫描线)

    pid=3642" style="">题目链接:hdu 3642 Get The Treasury 题目大意:三维坐标系,给定若干的长方体,问说有多少位置被覆盖3次 ...

  9. [Firebase] Deploy you website to Firebase

    If you are looking for a host website, you can try Firebase, heroku or AWS... Today, I tried to depl ...

  10. MYSQL 体系结构图 log commit