来源(参考)
个人理解
我尽量的将其转为我可以理解的形式并做记录
委托的意义
委托,是一个类,它通过定义一些方法的类型,从而使得可以将这些方法当作另一个方法的参数来进行传递,从而避免在程序中大量使用If-Else(Switch)语句,使程序具有更好的可扩展性。
委托的定义
一个简单的定义是:
namespace ... {
//定义在调用范围之外
//这样的定义,定义了一个返回类型为void,而参数为string的委托
//当对它做委托的时候,传入的函数参数,应该符合上述的类型
public delegate void Func(string name);
class ... {
}
}
而基于这样的定义其使用实例可以借用引用文章中的例子:
using System;
using System.Collections.Generic;
using System.Text;
namespace Delegate
{
//定义委托,它定义了可以代表的方法的类型
public delegate void GreetingDelegate(string name);
class Program
{
private static void EnglishGreeting(string name)
{
Console.WriteLine("Morning, " + name);
}
private static void ChineseGreeting(string name)
{
Console.WriteLine("早上好, " + name);
}
//注意此方法,它接受一个GreetingDelegate类型的参数,该参数是返回值为空,参数为string类型的方法
private static void GreetPeople(string name, GreetingDelegate MakeGreeting)
{
MakeGreeting(name);
}
static void Main(string[] args)
{
GreetPeople("Jimmy Zhang", EnglishGreeting);
GreetPeople("张子阳", ChineseGreeting);
Console.ReadKey();
}
}
}
一个稍微复杂的定义:(将委托放入一个类中,以符合封装性)
namespace ...{
public class Dele{
private int index;
//声明委托
public delegate void FuncEventHandler(Object sender, FuncEventArgs e);
//声明事件
public event FuncEventHandler Func;
//定义一个类,这个类会传递给Observer其感兴趣的信息
public class FuncEventArgs : EventArgs{
public readonly int index;
public FuncEventArgs(int index){
this.index = index;
}
}
// 可以提供给继承类来做重写,以便继承类拒绝其他对象对它的监视
protected virtual void OnFunc(BoiledEventArgs e)
{
if (Func != null)
{
// 如果有对象注册
Func(this, e); // 调用所有注册对象的方法
}
}
//做事情
public void FuncDoing()
{
int temp = 1;
FuncEventArgs f = new FuncEventArgs(temp)
}
}
class Program{
//实例化
Dele d = new Dele();
//注册
d.Func += FirstFunction;
//匿名注册
d.Func += (new 一个类).Function;
//静态注册
d.Func += 一个类.Function;
d.OnFunc();//会自动调用注册过的方法。
}
}
事件
我对委托中的事件的理解是,将声明的委托,当作是属性,托管给声明的事件。
这样,只要被注册的函数和委托声明的类型参数一致,事件会帮助完成注册这件事,从而不需要设置额外的操作。