您的位置:首页 > 其它

委托与事件

2012-01-27 22:33 197 查看
学习目标:

委托的定义

掌握并熟练使用委托

多重委托的理解

事件的掌握

[b]委托[/b]

委托就是可以对方法进行引用的类,与其他的类不同,委托类只对其匹配的方法进行引用,C#中委托是面向对象的,并且类型是安全的,委托方法的调用可以像任何其他方法一样,具有参数和返回值,但是分配给委托的方法必须与委托的返回类型和参数组成匹配,这里的方法可以是静态方法也可以是实例方法。

定义委托的语法类似于方法的定义,但是没有方法体,定义的前面要加上关键字delegate。

可以根据委托的可见性在委托定义上添加一般的访问修饰符:public、private和protected等

定义委托的语法:

public delegate void MyFirstDelegate(string message);

委托是只要定义就可以使用,并不需要关心它的实现。

委托的使用

委托相当于一个类,但是委托是一个值类型,使用委托就需要对委托进行实例化。实例化委托后,委托将把对它进行的方法调用传递给方法。调用方法传递给委托的参数被传递给方法,来自方法的返回值(如果有)由委托返回给调用方,称为调用委托。

示例:

View Code

//派生类TemperatureEventArgs
  public class TemperatureEventArgs : EventArgs
{
private int temperature;

public int Temperature
{
get { return temperature; }
//set { temperature = value; }
}
public TemperatureEventArgs(int _temperature)
{
temperature = _temperature;
}
}
 //事件触发类
public class EventSender
{
public delegate void TemperatureEventHander(object sender, TemperatureEventArgs e);
public event TemperatureEventHander temperaturePress;
protected virtual void OnTemperaturePess(TemperatureEventArgs e)
{
TemperatureEventHander hander = temperaturePress;
if (hander != null)
{
temperaturePress(this, e);
}
}
public void isTemperaturePess(int temperature)
{
OnTemperaturePess(new TemperatureEventArgs(temperature));
}
   }
  //事件发生处理类
public class EventReceive
{
public void Press(object sender, TemperatureEventArgs e)
{
if (e.Temperature > 80)
{
Console.WriteLine("报警器检测温度为{0},马上会发生火灾,请速撤离现场", e.Temperature);
}
else if (e.Temperature > 50 && e.Temperature <= 80)
{
Console.WriteLine("报警器检测温度太高,可能会发生火灾,请做好撤离现场的准备");
}
else
{
Console.WriteLine("这里温度正常,请安心工作");
}
}
   }
  //在主程序中调用事件
class Program
{
static void Main(string[] args)
{
bool trueorfalse = true;
while (trueorfalse)
{
Console.WriteLine("请输入检测器温度,(只能输入数字,否则会出现异常):");
int temperature = Convert.ToInt32(Console.ReadLine());
EventSender es = new EventSender();
EventReceive er = new EventReceive();
es.temperaturePress += new EventSender.TemperatureEventHander(er.Press);
es.isTemperaturePess(temperature);
if (temperature > 200)
{
trueorfalse = false;
}
Console.WriteLine("--------------------------------------");
Console.WriteLine("--------------------------------------");
}            Console.WriteLine("================================================================");
Console.WriteLine("由于温度太高报警器已经损坏,程序将在5秒后退出程序");
Console.WriteLine("请等候......");
Console.WriteLine("距系统关闭还有5秒");
System.Threading.Thread.Sleep(1000);
Console.WriteLine("离系统关闭还有4秒");
System.Threading.Thread.Sleep(1000);
Console.WriteLine("离系统关闭还有3秒");
System.Threading.Thread.Sleep(1000);
Console.WriteLine("离系统关闭还有2秒");
System.Threading.Thread.Sleep(1000);
Console.WriteLine("离系统关闭还有1秒");
System.Threading.Thread.Sleep(1000);
Console.WriteLine("...");
}
88    }


如上加粗部分为对委托与事件的调用,调用后程序会根据不同的温度做出不同的反应。

运行结果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: