委托是一个可以对方法进行引用的类,它具有一个签名,并且只能对与其签名匹配的方法进行引用。委托是一种特殊的对象类型,其特殊之处在于,以前定义的所有对象都包含数据,而委托包含的只有方法的地址。
实例1:使用委托
View Code
using System;
using System.Collections.Generic;
using System.Text;
namespace 练习
{
public delegate void MyFirstDelegate(string message);
class MyClass
{
public void WriteFirstMessage(string message)
{
Console.WriteLine(message);
}
}
class Program
{
public static void Main()
{
MyClass myClass = new MyClass();
MyFirstDelegate myFirst = new MyFirstDelegate(myClass.WriteFirstMessage);
myFirst("委托本省调用了委托");
}
}
}
using System.Collections.Generic;
using System.Text;
namespace 练习
{
public delegate void MyFirstDelegate(string message);
class MyClass
{
public void WriteFirstMessage(string message)
{
Console.WriteLine(message);
}
}
class Program
{
public static void Main()
{
MyClass myClass = new MyClass();
MyFirstDelegate myFirst = new MyFirstDelegate(myClass.WriteFirstMessage);
myFirst("委托本省调用了委托");
}
}
}
结果为:
委托在调用方法时不会考虑在什么类型的对象上调用,在调用静态方法时,由于实例化委托是一个对象,所以可以将其作为参数进行传递,也可以将其赋值给属性。
实例2:委托作为参数调用
View Code
using System;
using System.Collections.Generic;
using System.Text;
namespace 练习
{
public delegate void MyDelegate(int i, int j);
class MyNewClass
{
public static void Sum(int i, int j)
{
int sum = i + j;
Console.WriteLine("和:{0}+{1}={2}", i, j, sum);
}
public static void Prosuct(int i, int j)
{
int prosuct = i * j;
Console.WriteLine("积:{0}*{1}={2}", i, j, prosuct);
}
public static void MethodDelegate(int i, int j, MyDelegate myDelegate)
{
myDelegate(i, j);
}
}
class Program
{
static void Main(string[] args)
{
MyNewClass.MethodDelegate(10, 10, MyNewClass.Sum);
MyNewClass.MethodDelegate(10, 10, MyNewClass.Prosuct);
}
}
}
using System.Collections.Generic;
using System.Text;
namespace 练习
{
public delegate void MyDelegate(int i, int j);
class MyNewClass
{
public static void Sum(int i, int j)
{
int sum = i + j;
Console.WriteLine("和:{0}+{1}={2}", i, j, sum);
}
public static void Prosuct(int i, int j)
{
int prosuct = i * j;
Console.WriteLine("积:{0}*{1}={2}", i, j, prosuct);
}
public static void MethodDelegate(int i, int j, MyDelegate myDelegate)
{
myDelegate(i, j);
}
}
class Program
{
static void Main(string[] args)
{
MyNewClass.MethodDelegate(10, 10, MyNewClass.Sum);
MyNewClass.MethodDelegate(10, 10, MyNewClass.Prosuct);
}
}
}
其结果为:
委托是一个特殊的对象,可以使用“+”运算符将它们分配一个要成为多路广播委托的委托实例。
实例3:多重委托
View Code
using System;
using System.Collections.Generic;
using System.Text;
namespace 练习
{
public delegate void MyDelegate(int i, int j);
class Program
{
static void Main(string[] args)
{
Program p = new Program();
MyDelegate del = new MyDelegate(p.Method);
del(10, 20);
Console.WriteLine("使用+运算符后,显示的结果");
del += p.Methodl;
del(20, 20);
Console.WriteLine("使用-运算符后,显示的结果");
del -= p.Method;
del(20, 20);
}
void Method(int i, int j)
{
Console.WriteLine("求和:{0}+{1}={2}", i, j, i + j);
}
void Methodl(int i, int j)
{
Console.WriteLine("求积:{0}*{1}={2}", i, j, i * j);
}
}
}
using System.Collections.Generic;
using System.Text;
namespace 练习
{
public delegate void MyDelegate(int i, int j);
class Program
{
static void Main(string[] args)
{
Program p = new Program();
MyDelegate del = new MyDelegate(p.Method);
del(10, 20);
Console.WriteLine("使用+运算符后,显示的结果");
del += p.Methodl;
del(20, 20);
Console.WriteLine("使用-运算符后,显示的结果");
del -= p.Method;
del(20, 20);
}
void Method(int i, int j)
{
Console.WriteLine("求和:{0}+{1}={2}", i, j, i + j);
}
void Methodl(int i, int j)
{
Console.WriteLine("求积:{0}*{1}={2}", i, j, i * j);
}
}
}
其结果为:
在委托中使用匿名方法就不必创建单独的方法,减少了委托所需要的编码开销,Lambda表达式实际上就是一个匿名函数,他可以使代码更加简洁。
事件是建立程序之间的连接的方法和运行过程间的终结操作。事件的处理程序基于委托,如果定义一个事件是没有任何意义的。事件可以分为两部分:事件发生的类和事件接收处理的类。要定义事件就必须先定义委托,用委托定义事件,需要使用event关键字。
实例4:委托与事件
View Code
using System;
using System.Collections.Generic;
using System.Text;
namespace 练习
{
public class TemperatureEventArgs : EventArgs
{
private int temperature;
public int Temperature
{
get { return temperature; }
}
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("...");
}
}
}
using System.Collections.Generic;
using System.Text;
namespace 练习
{
public class TemperatureEventArgs : EventArgs
{
private int temperature;
public int Temperature
{
get { return temperature; }
}
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("...");
}
}
}
其结果为: