PanPen120在CSDN上原创,如其他网站转载请注意排版和写明出处:
今天一直在研究委托,因为有函数指针的基础,还容易上手,但是对于一些概念和实践,总是为了弄的非常清楚而纠结,这几篇关于委托的文章我是结合《C#与.NET4高级程序设计》、MSDN、借鉴其他人的博文来总结话语,以最直接简洁的话来阐述清楚(在我弄懂之前网上的感觉都很模糊)
namespace DelegateDemo
{
//function1:
public delegate int setMyName(string name); //委托类型
//function2:
class MyClass
{
public delegate int setMyName2(string name);
public setMyName mermber; //委托类型成员
}
//function3
class MyClass2
{
public delegate int setMyName3(string name);
private setMyName3 mermber2;
//注册函数
public MyClass2(setMyName3 fun,string name)
{
mermber2 = fun;
if (null != mermber2)
{
mermber2(name);
}
}
}
class Program
{
//要调用的方法
public static int GetMyName(string name)
{
Console.WriteLine("My Name Is {0}",name);
return 1;
}
static void Main(string[] args)
{
//function1:
setMyName setName = new setMyName(GetMyName);
setName("Function1:婴儿");
//function2:
MyClass setName2 = new MyClass();
setName2.mermber = GetMyName;
setName2.mermber("Function2:青少年");
//function3:
MyClass2 setName3 = new MyClass2(GetMyName, "Function3:中年");
//function3(other):
MyClass2 setName4 = new MyClass2(new MyClass2.setMyName3(GetMyName), "Function4:老年");
//支持多路广播(维护一个可调用方法列表,顺序调用列表中的委托)
//+=合并(简写) -=注销
setMyName multicast = null;
multicast += (setName2.mermber);
//演示合并需要两个……为了不破坏function3的封装性建setName5
setMyName setName5 = GetMyName;
multicast += setName5; //合并的是两个委托类型对象的成员
multicast("合并的是两个委托类型对象的成员:迟暮");
multicast += GetMyName;
multicast += GetMyName;
multicast("合并的是两个调用的方法:耄耋"); //合并的是两个调用的方法(更能表现出委托类型或者是成员都是一个地址)
Console.ReadLine();
}
}
}
//方法一:定义委托类型
// new委托对象(传入要调用的方法名)
// 对象();
//方法二:定义委托类型
// 定义该委托类型的成员变量(public)
// 该成员变量 = 调用的方法
// 成员变量();
//方法三:定义委托类型
// 定义该委托类型的成员变量(private)
// 写一个注册函数(参数:委托类型)
// 调用该注册函数(传入要调用的方法)-----------两种传入方式:<1>要调用方法的名字 ||
// <2>new委托类型所在的类点出委托类型(要调用的方法) ||运行结果相同
// 例如: new Car.CarEngineHandler(OnCarEngineEvent) ||
// 调用该类另一个辅助函数:功能 1:判断委托的成员变量是否为null
// 2. 使用委托的成员变量();
//备注1:所谓的注册函数就是一个普通函数,目的是为了封装委托
//备注2:在方法一中第二步骤的参数------------------------------------两种方式:||<1>要调用的方法是static可直接传入该方法的名字
// ||<2>不是static则传入该方法所在类的实体对象.该方法名
//备注3:按照方法三将委托定义在使用它的类中是一种很普遍的做法
//备注4:方法三中第一种传入方式叫做---方法组转换语法(不需要委托对象直接传入方法名)------ -----C#2.0后的新语法