有关委托与事件的几个小事例
2009-05-06 16:49
190 查看
using System; public class A { public A() { } //定义的一委托deletag //这个委托可以调用方法的签名为:1.方法要只有一个string类型参数 2.该方法没有返回值 public delegate void deletag(string t); //这个方法可以作为委托的方法 public static void showname(string name) { Console.WriteLine(name+"1"); } //这个方法可以作为委托的方法 public static void showsex(string sex) { Console.WriteLine(sex+"2"); } public static void showage(string age) { Console.WriteLine(age + "3"); } //这个方法将委托作为参数来使用 public static void showMethod(string str, deletag t) { t(str);//只有在调用委托时才需要给方法参数 } public static void Main() { showMethod("张锐", showname);//直接给方法,而不是委托实例? //deletag t = new deletag(showsex);//实例化时不需给参数 deletag t;//这里看到的委托没有实例化也可以指向一个或多个方法签名? t = showsex; t += showage;//给委托加上另一个方法,这时当前委托实例里有两个方法,调用这个委托时,它将依加入方法顺序来调用方法 //t -= showage;//给当前委托实例中删除一个方法 showMethod("男", t);//这里给的是委托实例 t("张锐是一个好人");//这里调用的是showsex,showage方法 Console.ReadKey(); } }
using System; // 热水器 public class Heater { private int temperature; public delegate void BoilHandler(int param); //声明委托 public event BoilHandler BoilEvent; //声明事件 // 烧水 public void BoilWater() { for (int i = 0; i <= 100; i++) { temperature = i; if (temperature > 95) { if (BoilEvent != null) { //如果有对象注册 BoilEvent(temperature); //调用所有注册对象的方法 } } } } } // 警报器 public class Alarm { public void MakeAlert(int param) { Console.WriteLine("Alarm:嘀嘀嘀,水已经 {0} 度了:", param); } } // 显示器 public class Display { public static void ShowMsg(int param) { //静态方法 Console.WriteLine("Display:水快烧开了,当前温度:{0}度。", param); } } class Program { static void Main() { Heater heater = new Heater(); Alarm alarm = new Alarm(); heater.BoilEvent += alarm.MakeAlert; //注册方法 heater.BoilEvent += Display.ShowMsg; //注册静态方法 heater.BoilWater(); //烧水,会自动调用注册过对象的方法 Console.ReadKey(); } }
using System; // 热水器 public class Heater { private int temperature; public string type = "RealFire 001"; // 添加型号作为演示 public string area = "China Xian"; // 添加产地作为演示 //声明委托 public delegate void BoiledEventHandler(Object sender, BoliedEventArgs e); public event BoiledEventHandler Boiled; //声明事件 // 定义BoliedEventArgs类,传递给Observer所感兴趣的信息 public class BoliedEventArgs : EventArgs { public readonly int temperature; public BoliedEventArgs(int temperature) { this.temperature = temperature; } } // 可以供继承自 Heater 的类重写,以便继承类拒绝其他对象对它的监视 protected virtual void OnBolied(BoliedEventArgs e) { if (Boiled != null) { // 如果有对象注册 Boiled(this, e); // 调用所有注册对象的方法 } } // 烧水。 public void BoilWater() { for (int i = 0; i <= 100; i++) { temperature = i; if (temperature > 95) { //建立BoliedEventArgs 对象。 BoliedEventArgs e = new BoliedEventArgs(temperature); OnBolied(e); // 调用 OnBolied方法 } } } } // 警报器 public class Alarm { public void MakeAlert(Object sender, Heater.BoliedEventArgs e) { Heater heater = (Heater)sender; //这里是不是很熟悉呢? //访问 sender 中的公共字段 Console.WriteLine("Alarm:{0} - {1}: ", heater.area, heater.type); Console.WriteLine("Alarm: 嘀嘀嘀,水已经 {0} 度了:", e.temperature); Console.WriteLine(); } } // 显示器 public class Display { public static void ShowMsg(Object sender, Heater.BoliedEventArgs e) { //静态方法 Heater heater = (Heater)sender; Console.WriteLine("Display:{0} - {1}: ", heater.area, heater.type); Console.WriteLine("Display:水快烧开了,当前温度:{0}度。", e.temperature); Console.WriteLine(); } } class Program { static void Main() { Heater heater = new Heater(); Alarm alarm = new Alarm(); heater.Boiled += alarm.MakeAlert; //注册方法 //heater.Boiled += (new Alarm()).MakeAlert; //给匿名对象注册方法 //heater.Boiled += new Heater.BoiledEventHandler(alarm.MakeAlert); //也可以这么注册 heater.Boiled += Display.ShowMsg; //注册静态方法 heater.BoilWater(); //烧水,会自动调用注册过对象的方法 Console.ReadKey(); } }
--模拟页面中的控件
public class Class1
{
public delegate void mydelegate(string str);
public event mydelegate myevent;
public void doevent()
{
if (myevent != null)
{
myevent("测试数据");
}
}
}
--模拟PAGE页面
public class Class2
{
private Class1 c1;
private string message;
private void init()
{
c1 = new Class1();
c1.myevent += showString;
}
public Class2()
{
init();
}
public void showString(string message)
{
this.message = message;
}
public string startevent()
{
c1.doevent();
return message;
}
}
---调用的页面
protected void Button1_Click(object sender, EventArgs e)
{
Class2 c2 = new Class2();
this.Button1.Text = c2.startevent();
}
相关文章推荐
- 一个有关热水器 的 事件绑定委托 实例
- 跟我学ASP.NET委托和事件的入门应用和提高事例
- Unity之C#——委托与事件,观察者模式,猫和老鼠事例
- Oracle数据库和session等待事件有关的几个视图
- 关于C# 委托(delegate)与事件(event)的用法及事例
- 跟touch事件有关的几个系统级方法
- 关于C# 委托(delegate)与事件(event)的用法及事例
- 源码-JavaScript&jQuery交互式前端开发-第6章-事件-使用事件委托
- c#之再战委托事件多线程2_委托和事件结合降低模块低耦合
- 关于事件与委托的疑惑
- 利用反射获得委托和事件以及创建委托实例和添加事件处理程序
- C# 中的委托和事件
- C# 委托,事件和Lambda表达式
- 几个有关图的算法2(DFS,TopoLogicalSort) .
- js委托事件-addEventListeners(冒泡方向)
- 委托和事件的应用,模拟一个战斗机防盗器
- JavaScript面试问题:事件委托和this
- 对C#委托及事件委托的理解
- C#中的委托和事件.pdf
- 事件委托