public void Description(string programerName, DescriptionDelegate description) { description(programerName); }
这个要领时传一个DescriptionDelegate description托付范例进来,那末关于这个要领再做一下修正,能用起来轻易一些,代码也更合理一些。把托付封装起来,然后把差别言语的程序员形貌要领提出来:
封装:
public class ProgramDescriptionDelegate2 { public delegate void DescriptionDelegate(string programerName); public DescriptionDelegate myDelegate; public void Description(string programerName) { myDelegate(programerName); } }
提出的类:
public class TestDescriptionDelegate2 { public void CsharpProgramer(string programerName) { Console.WriteLine(string.Format("{0} 运用C#编程!", programerName)); } public void CProgramer(string programerName) { Console.WriteLine(string.Format("{0}运用C言语编程!", programerName)); } public void JavaProgramer(string programerName) { Console.WriteLine(string.Format("{0} 运用Java言语编程!", programerName)); } public void Test() { ProgramDescriptionDelegate2 pe = new ProgramDescriptionDelegate2(); pe.myDelegate = CsharpProgramer; pe.myDelegate += CProgramer; pe.Description("SamYang"); } }
如许就比较合理一些,由于public void CsharpProgramer(string programerName)这些要领,应该是用户能够随时定义的,能够看作随时更改的。而ProgramDescriptionDelegate2完整作为一个大众的类,它只担任实行绑定在托付上的要领。
挪用:
TestDescriptionDelegate2 t = new TestDescriptionDelegate2(); t.Test();
再回过来看ProgramDescriptionDelegate2类,public DescriptionDelegate myDelegate;应该是一个字段,依据面向对象的封装性,字段要封装为属性。那末在这里封装我们要运用一个很有效的字段event。
封装以下:
public class ProgramerDescriptionEvent { public delegate void DescriptionDelegate(string programerName); private event DescriptionDelegate myEvent; public event DescriptionDelegate MyEvent { add { this.myEvent += value; } remove { this.myEvent -= value; } } public void Description(string programerName) { myEvent(programerName); } }
public class TestEvent { public void CsharpProgramer(string programerName) { Console.WriteLine(string.Format("{0} 运用C#编程!", programerName)); } public void CProgramer(string programerName) { Console.WriteLine(string.Format("{0}运用C言语编程!", programerName)); } public void JavaProgramer(string programerName) { Console.WriteLine(string.Format("{0} 运用Java言语编程!", programerName)); } public void Test() { ProgramerDescriptionEvent pe = new ProgramerDescriptionEvent(); pe.MyEvent += CsharpProgramer; pe.MyEvent += JavaProgramer; pe.Description("SamYang");//平常这个实行是放在激发事宜实行的处所 } }
挪用:
TestEvent te = new TestEvent(); te.Test();
效果以下:
能够看出,什么是事宜,实在实质运用的是托付,然则运用了event是这类托付变成了一种机制,叫事宜。
那末看msdn对托付和事宜的形貌:
事宜是对象发消息,以发信号关照操纵的发作,操纵多是由用户交互(鼠标、键盘操纵等)激发的,或许由某些其他的程序逻辑触发。捕捉事宜并对其作出相应的对象叫做事宜接收方。
在事宜通信中,事宜发送方类不知道哪一个对象或要领将接收到它激发的事宜。所须要的是在源和接收方之间存在一个序言。.NET Framework 定义了一个特别的范例 (Delegate),该范例供应函数指针的功用。托付是可保存对要领的援用的类。与其他的类差别,托付类具有一个署名,而且它只能对与其署名婚配的要领举行援用。如许,托付就等效于一个范例平安函数指针或一个回调。虽然托付具有很多其他的用处,但这里只议论托付的事宜处置惩罚功用。一个托付声明足以定义一个托付类。声明供应托付的署名,大众言语运行库供应完成。比方:
public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);
delegate 关键字关照编译器 AlarmEventHandler 是一个托付范例。根据商定,.NET Framework 中的事宜托付有两个参数:激发事宜的源和该事宜的数据。即sender和e。
以上就是C#基础知识整顿 基础知识(21) 托付(二)的内容,更多相关内容请关注ki4网(www.ki4.cn)!