c#笔记04-委托 事件
来源:互联网 发布:live800服务端源码 编辑:程序博客网 时间:2024/06/06 03:48
有如下示例:
委托 -- 基本使用
事件 委托 --发送无参数消息
事件 委托 --发送有参数消息
事件 委托 --传递方法的方法
张永辉 2012年11月9日
----------------------------------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace cs1
{
//--------------------Delegate 委托-------------------------------------------------------------
//Delegate它实际上是一个能够持有对某个方法的引用的类,
//delegate类能够拥有一个签名(signature),并且它"只能持有与它的签名相匹配的方法的引用".类似指针,能够指向非静态的指针。
class class4
{
public delegate void MyDelegate(string name); //声明 MyDelegate() 一个委托
public static void MyFun0(string name) //被委托的方法0,它与MyDelegate具有相同的参数和返回值类型
{
Console.WriteLine("MyFun 0: " + name);
}
public static void MyFun1(string name) //被委托的方法1
{
Console.WriteLine("MyFun 1: " + name);
}
}
class key_delegate
{
public key_delegate()
{
Console.WriteLine("key_delegate================");
//创建委托对象
class4.MyDelegate mdf = new class4.MyDelegate(class4.MyFun0);
mdf("123"); //调用到委托 class4.MyFun0
class4.MyFun0("456"); //直接调用函数
mdf = class4.MyFun1; //更改委托
mdf("789");
}
}
//--------------------事件 委托 发送无参数消息--------------------------------------------------
//事件触发器 参考http://blog.csdn.net/jamestaosh/article/details/4372172
class Dog
{
//1.声明关于事件的委托
public delegate void AlarmEventHandler(object sender, EventArgs e);
//一般的事件处理程序接受两个参数,一个是事件的发送者sender,一个是事件参数e 。用于在发送者和接收者之间传递信息
//2.声明事件 将创建的委托和特定事件(Alarm)关联 (需要向Alarm添加事件)
public event AlarmEventHandler Alarm;
//3.编写引发事件的函数 调用此函数会引发事件
public void OnAlarm()
{
if (this.Alarm != null) //事件不是空才能调用
{
Console.WriteLine("狗报警: 有小偷进来了,汪汪~~~~~~~");
this.Alarm(this, new EventArgs()); // 触发事件
}
}
}
//事件接收者
class Host
{
//4.注册事件处理程序
public Host(Dog dog)
{
//产生一个委托实例并添加到dog.Alarm产生的事件列表中
dog.Alarm += new Dog.AlarmEventHandler(HostHandle);
}
//5.事件处理程序
void HostHandle(object sender, EventArgs e)
{
Console.WriteLine("主 人: 抓住了小偷!");
}
}
class key_event
{
public key_event()
{
Console.WriteLine("key_event===================");
//场景:狗发现小偷并报警, 主人处理报警
Dog dog = new Dog(); //实例化一个事件发送器
Host host = new Host(dog); //实例化一个事件接收器
dog.OnAlarm(); //触发事件
}
}
//事件抽象总结如下:C#中事件产生和实现的流程:
//1. 定义A为产生事件的实例,a为A产生的一个事件
//2. 定义B为接收事件的实例,b为处理事件的方法
//3. A由于用户(程序编写者或程序使用者)或者系统产生一个a事件(例如点击一个Button,产生一个Click事件)
//4. A通过事件列表中的委托对象将这个事件通知给B
//5. B接到一个事件通知(实际是B.b利用委托来实现事件的接收)
//6. 调用B.b方法完成事件处理
/*public class A
{
public delegate void EventHandler(object sender);
public event EventHandler a;
public void Run()
{
Console.WriteLine("Trigger an event.");
a(this);
}
}
class B
{
public B(A a)
{
a.a += new A.EventHandler(this.b);
}
private void b(object sender)
{
Console.WriteLine("Received and handled an event.");
Console.Read();
}
}*/
//--------------------事件 委托 发送有参数消息--------------------------------------------------
//事件参数
public class EventArgsParameter : EventArgs
{
public int numberOfThief;
public EventArgsParameter(int number) //构造函数
{
numberOfThief = number;
}
}
//事件触发器
class Dog1
{
//1.声明关于事件的委托 无参数[..., EventArgs e)]
public delegate void AlarmEventHandler(object sender, EventArgsParameter e);
//2.声明事件
public event AlarmEventHandler Alarm;
//3.编写引发事件的函数 无参数[(EventArgs e)]
public void OnAlarm(EventArgsParameter e)
{
if (this.Alarm != null)
{
Console.WriteLine("狗报警: 有小偷进来了,汪汪~~~~~~~");
this.Alarm(this, e); // 触发事件 无参数[ this.Alarm(this, new EventArgs()); ]
}
}
}
//事件接收者
class Host1
{
//4.注册事件处理程序
public Host1(Dog1 dog)
{
//产生一个委托实例并添加到dog.Alarm产生的事件列表中
dog.Alarm += new Dog1.AlarmEventHandler(HostHandle);
}
//5.事件处理程序 无参数[..., EventArgs e)]
void HostHandle(object sender, EventArgsParameter e)
{
Console.WriteLine("主 人: 抓住了{0}个小偷!", e.numberOfThief);
}
}
class key_event1
{
public key_event1()
{
Console.WriteLine("key_event1==================");
//场景:狗发现小偷并报警, 主人处理报警
Dog1 dog = new Dog1(); //实例化一个事件发送器
Host1 host = new Host1(dog); //实例化一个事件接收器
EventArgsParameter e = new EventArgsParameter(3); //无参数[]
dog.OnAlarm(e); //触发事件 无参数时此句的写法[dog.OnAlarm(e);]
}
}
//--------------------事件 委托 传递方法的方法--------------------------------------------------
//场景:向英国人打招呼用英语 向中国人打招呼用中文
//定义委托,它定义了可以代表的方法的类型
class moring
{
public delegate void GreetingDelegate(string name); //定义委托,它定义了可以代表的方法的类型
public void EnglishGreeting(string name) //方法1
{
Console.WriteLine("Morning, " + name);
}
public void ChineseGreeting(string name) //方法2
{
Console.WriteLine("早上好, " + name);
}
//注意此方法,它接受一个GreetingDelegate类型的方法作为参数
public void GreetPeople(string name, GreetingDelegate Greeting)
{
Greeting(name);
}
}
class key_delegatefun
{
public key_delegatefun()
{
Console.WriteLine("key_delegatefun=============");
moring Gp = new moring();
Gp.GreetPeople("Jimmy Zhang", Gp.EnglishGreeting);
Gp.GreetPeople("张子阳", Gp.ChineseGreeting);
moring.GreetingDelegate delegate1;
delegate1 = Gp.EnglishGreeting; // 先给委托类型的变量赋值
delegate1 += Gp.ChineseGreeting; // 给此委托变量再绑定一个方法
Gp.GreetPeople("zyhui", delegate1);
}
}
//----------------------主进程------------------------------------------------------------------
class Program
{
static void Main(string[] args)
{
key_delegate k4 = new key_delegate();
key_event1 k5 = new key_event1();
key_delegatefun k7 = new key_delegatefun();
key_event k6 = new key_event();
Console.Read();
}
}
}
- c#笔记04-委托 事件
- C#事件 委托 学习笔记
- C#笔记 委托与事件
- C#笔记 委托 事件 匿名方法 Action
- 读C#委托与事件笔记
- C#委托与事件学习笔记
- c# 委托与事件 学习笔记
- C#学习笔记19-委托和事件
- C#委托及事件委托
- c# 委托和委托事件
- 【unity3d-C#学习笔记】C#中的委托和事件
- C# 事件 委托 教程
- C# 事件 委托 教程
- C#委托及事件
- c# 委托与事件
- C# 委托和事件
- C#委托与事件
- C#委托,事件
- 润乾设计器的换行问题
- 集合之SortedList+Hashtable
- ESQL
- 利用SAPI对WAV文件进行语音识别
- 虚基类和多重继承总结
- c#笔记04-委托 事件
- vim快捷键大全
- 使用POI导出excel,完美兼容2003及2007以上版本,购物车原理
- 一个有用的ANSI字符串类String的实现及使用演示
- 跨平台视频会议
- 命名词汇总结
- for in遍历nodeList
- 在 Asp.NET MVC 中使用 SignalR 实现推送功能
- Spring 关键字