简述:
delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类。与其它的类不同,delegate类能够拥有一个签名(signature),并且它只能持有与它的签名相匹配的方法的引用。它所实现的功能与C/C++中的函数指针十分相似。它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m。但与函数指针相比,delegate有许多函数指针不具备的优点。首先,函数指针只能指向静态函数,而delegate既可以引用静态函数,又可以引用非静态成员函数。在引用非静态成员函数时,delegate不但保存了对此函数入口指针的引用,而且还保存了调用此函数的类实例的引用。其次,与函数指针相比,delegate是面向对象、类型安全、可靠的受控(managed)对象。也就是说,runtime能够保证delegate指向一个有效的方法,你无须担心delegate会指向无效地址或者越界地址。委托也成就之后的匿名函数和Lambda表达式。
event就是由某个对象发出的消息,这个消息标志着某个特定的行为发生了,或者某个特定的条件成立了。比如用户点击了鼠标、socket上有数据到达等。那个触发(raise)事件的对象称为事件的发送者(event sender),捕获并响应事件的对象称为事件的接收者(event receiver)。C#中事件的实现依赖于delegate,C#中的事件处理实际上是一种具有特殊签名的delegate,是一种封装过的delegate
事件和委托的区别
1.委托允许直接通过委托去访问相应的处理函数,而事件只能通过公布的回调函数去调用
2.事件只能通过“+=”,“-=”方式注册和取消订户处理函数,而委托除此之外还可以使用“=”直接赋值处理函数。
delegate的使用案例
class Program
{
static void Main(string[] args)
{
testExampleexample = new Example();
example.Gorun();
Console.ReadKey();
}
}
public class testExample
{
public delegate void FunSth(string str);
internal void Gorun()
{
//声明一个委托变量,并把已知方法作为其构造函数的参数
FunSth = new FunSth(Print);
string str = "Hello,World";
//通过委托的静态方法Invoke触发委托
d.Invoke(str);
}
void Print(string str)
{
Console.WriteLine(str);
}
}
上面使用详解:
1、 在CLR运行时,委托FunSth实际上就一个类,该类有一个参数类型为方法的构造函数,并且提供了一个Invoke实例方法,用来触发委托的执行。
2、委托FunSth定义了方法的参数和返回类型
3 、通过委托FunSth的构造函数,可以把符合定义的方法赋值给委托
4 、调用委托的实例方法Invoke执行了方法
event的使用案例
public class TestExample
{
public delegate void FunSth(object sender, EventArgs e);
public event FunSth myDoRunSth;
internal void Go()
{
//声明一个委托变量,并把已知方法作为其构造函数的参数
FunSth d = new FunSth(Print);
object sender = 10;
EventArgs e = new EventArgs();
myDoRunSth += new FunSth(d);
myDoRunSth(sender, e);
}
void Print(object sender, EventArgs e)
{
Console.WriteLine(sender);
}
}
}
上面的使用详解
1 声明了事件FunSth,事件的类型是FunSth这个委托
2 通过+=为事件注册委托
3 通过FunSth委托的构造函数为事件注册委托实例
4 采用委托变量(参数列表)这种形式,让事件执行方法