委托:按我自己的理解就是将一个方法交给一个对象(不是代码意义上的对象),让这个对象去帮我调用这个方法;
委托的概念:
委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。
/// <summary>
/// 定义委托
/// </summary>
/// <returns></returns>
delegate string Mydelegate();
static void Main(string[] args)
{
//实例化委托 调用方法GetStr
Mydelegate mydelegate = new Mydelegate(GetStr);
//实例化委托 调用方法GetStr_1
Mydelegate mydelegate1 = new Mydelegate(GetStr_1);
Console.WriteLine(mydelegate());
Console.WriteLine(mydelegate1());
Console.ReadKey();
}
static string GetStr()
{
return "委托调用1";
}
static string GetStr_1()
{
return "委托调用2";
}
委托可以让我们不用直接去调用方法体,而是通过我们创建的委托对象去调用
static void Main(string[] args)
{
MyClassA myClassA = new MyClassA();
MyClassB myClassB = new MyClassB();
Console.WriteLine(myClassA.AddNum());
myClassB.anum =new MyClassB.GetMyClassAnum(myClassA.AddNum);
Console.WriteLine(myClassB.AddNum());
Console.ReadKey();
}
class MyClassA
{
public int num = 0;
public int AddNum()
{
return num+=1;
}
}
class MyClassB
{
public int num = 10;
public delegate int GetMyClassAnum();
public GetMyClassAnum anum;
public int AddNum()
{
return num+ anum();
}
}
这是一个不怎么恰当的例子:
定义了两个类MyClassA和MyClassB,两者都有num字段和AddNum方法,MyClassB中多了一个委托;方法也有些不相同;
再看Main方法中的调用
MyClassA myClassA = new MyClassA();
MyClassB myClassB = new MyClassB();
Console.WriteLine(myClassA.AddNum());
myClassB.anum =new MyClassB.GetMyClassAnum(myClassA.AddNum);
Console.WriteLine(myClassB.AddNum());
分别实例化两个类,并将MyClassA的方法实例化给了MyClassB的anum委托,最后打印MyClassB中AddNum方法的返回值;
上面代码要做的就是B类的AddNum方法要计算A类中num+1后的值和B类中num的和;这是使用委托实现的代码,一般情况的代码如下:
static void Main(string[] args)
{
MyClassA myClassA = new MyClassA();
MyClassB myClassB = new MyClassB();
Console.WriteLine(myClassB.AddNum(myClassA.AddNum()));
Console.ReadKey();
}
class MyClassA
{
public int num = 0;
public int AddNum()
{
return num+=1;
}
}
class MyClassB
{
public int num = 10;
public int AddNum(int anum)
{
return num+ anum;
}
}
一般情况如果要实现刚才的逻辑就需要把A类中的结果参数传递到B类中,使用委托就不需要传递这个参数了;
另外一个需求,当B类中调用AddNum方法对num加几操作时,同时也要对A类中的num做加几的操作,使用委托就可以让B在做加操作的时候自动对A做加操作,而不用我们单独调用A的增加方法,这个就和事件一样,当执行某一操作时触发某一事件。
static void Main(string[] args)
{
MyClassA myClassA = new MyClassA();
MyClassB myClassB = new MyClassB();
myClassB.anum = myClassA.AddNum;
myClassB.AddNum(3);
myClassA.GetNum();
Console.ReadKey();
}
class MyClassA
{
private int num = 0;
public int AddNum(int N)
{
return num+=N;
}
public void GetNum()
{
Console.WriteLine(num);
}
}
class MyClassB
{
private int num = 10;
public delegate int GetMyClassAnum(int N);
public GetMyClassAnum anum;
public int AddNum(int N)
{
anum(N);
return num+= N;
}
public void GetNum()
{
Console.WriteLine(num);
}
}
事件(Event) 基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些提示信息,如系统生成的通知。应用程序需要在事件发生时响应事件。例如,中断。
C# 中使用事件机制实现线程间的通信;
上面的代码实质上就是用委托实现了事件的功能;为什么还要单独有事件呢?我的理解是事件更安全!因为委托的公共的,你可以调用,别人也一样可以调用;在这个委托可见的地方都可以像方法一样去调用委托,这样你的委托到底是谁调用了你可能并不知道;而事件不一样,事件在其他地方是不可以像方法一样去使用的,也就是别人用不了你的事件;
更新上面代码:
static void Main(string[] args)
{
MyClassA myClassA = new MyClassA();
MyClassB myClassB = new MyClassB();
myClassB.anum += myClassA.AddNum;
myClassB.AddNum(3);
myClassA.GetNum();
Console.ReadKey();
}
class MyClassA
{
private int num = 0;
public int AddNum(int N)
{
return num+=N;
}
public void GetNum()
{
Console.WriteLine(num);
}
}
class MyClassB
{
private int num = 10;
public delegate int GetMyClassAnum(int N);
public event GetMyClassAnum anum;
public int AddNum(int N)
{
anum(N);
return num+= N;
}
public void GetNum()
{
Console.WriteLine(num);
}
}