托付的运用
事宜是一种机制,事宜是经由过程托付完成的,所以看邃晓了托付,关于事宜也就能够更好的理解了。先看下面一个小例子。
这是形貌差别言语的顺序员的代码:
比方运用C#的顺序员我们如许形貌,个中programerName参数示意这个顺序员的姓名。
public void CsharpProgramer(string programerName) { Console.WriteLine(string.Format("{0} 运用C#编程!", programerName)); }
运用Java的,
public void JavaProgramer(string programerName) { Console.WriteLine(string.Format("{0} 运用Java言语编程!")); }
那末这么多言语,怎样辨别这是哪一个顺序员呢?运用一个罗列来示意,
public enum ProgramLanguage { CSharp, C, Java }
那末举行一个完全的形貌,代码以下:
public class ProgramerDescription { //01 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言语编程!")); } //02 public void Description(string programerName, ProgramLanguage type) { switch (type) { case ProgramLanguage.CSharp: CsharpProgramer(programerName); break; case ProgramLanguage.C: CProgramer(programerName); break; case ProgramLanguage.Java: JavaProgramer(programerName); break; default: Console.WriteLine("A kind of new Language that you never heard of."); break; } } } public enum ProgramLanguage { CSharp, C, Java }
挪用:
ProgramerDescription pm = new ProgramerDescription(); pm.Description("杨友山", ProgramLanguage.CSharp);
这时候,输出"杨友山 运用C#编程!";
如许就开端完成了一个对顺序员形貌的简朴完成。这里的Description要领是经由过程一个罗列范例来区分差别的言语。如许它的保护性是比较差的,由于另有许多编程言语(C++,php,等),假如想加一种言语就要增添一个对应的要领,然后就要修正ProgramLanguage这个罗列范例。增添要领对原顺序影响不大,由于能够用分部类来完成,而修正罗列就不适宜了,这也不符合面向对象设想头脑的开放关闭准绳。
那末在Description要领中怎样处置惩罚呢,也就是不必罗列了,Description要领如何来辨别该挪用哪一个要领(CsharpProgramer,CProgramer,JavaProgramer)对顺序员举行形貌。
public void Description(string programerName, 某范例 某参数)
{
//挪用对应的要领
}
这里的某范例就是要用它来区分哪一个要领的范例,换句话说,最好就是在这里我直接把我想要挪用的要领当作参数传进去。比方我要挪用CProgramer要领来形貌C顺序员,
ProgramerDescription pm = new ProgramerDescription();
pm.Description("D.M.Ritchie", CProgramer);
根据这个主意,public string Description(string programerName, 某范例 某参数)的“某范例 某参数”该怎样示意呢?
固然我们就想到C#中的托付delegate了。托付是一种数据结构,它援用静态要领或援用类实例及该类的实例要领。 用托付来完成上述的代码:
public class ProgramDescriptionDelegate { //托付,示意要领 public delegate void DescriptionDelegate(string programerName); //01 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言语编程!")); } //02 public void Description(string programerName, DescriptionDelegate description) { description(programerName); } }
挪用:
ProgramDescriptionDelegate pm = new ProgramDescriptionDelegate(); pm.Description("杨友山", pm.CsharpProgramer);
效果是和最最先的代码是一样的。
什么是托付?MSDN如许诠释的:托付是一种定义要领署名的范例,能够与具有兼容署名的任何要领关联,能够经由过程托付挪用要领。托付用于将要领作为参数通报给其他要领。时候处置惩罚顺序就是经由过程托付挪用的要领。
仔细看运用托付的代码,
public void Description(string programerName, DescriptionDelegate description)。挪用时,
DescriptionDelegate description传入的是 pm.CsharpProgramer,也就是此时description=pm.CsharpProgramer。实在我们还能够如许挪用:
//要领和托付绑定 ProgramDescriptionDelegate pm = new ProgramDescriptionDelegate(); YYS.CSharpStudy.Window.SDelegate.ProgramDescriptionDelegate.DescriptionDelegate csharpDelegate = pm.CsharpProgramer; YYS.CSharpStudy.Window.SDelegate.ProgramDescriptionDelegate.DescriptionDelegate cdelegate = pm.CProgramer; pm.Description("杨友山", csharpDelegate); pm.Description("D.M.Ritchie", cdelegate);
效果:
再做修正:
ProgramDescriptionDelegate pm = new ProgramDescriptionDelegate(); YYS.CSharpStudy.Window.SDelegate.ProgramDescriptionDelegate.DescriptionDelegate pdelegate = null; pdelegate += pm.CsharpProgramer; pdelegate += pm.CProgramer; pm.Description("杨友山", pdelegate);
效果:
这里先执行了pm.CsharpProgramer,然后又执行了pm.CProgramer要领。
能够看出托付不光能够将要领作为参数,而且还能够将要领绑定,而起还能够绑定多个。
运用+=绑定要领,作废则运用-=举行作废,上面的挪用能够修正以下:
ProgramDescriptionDelegate pm = new ProgramDescriptionDelegate(); YYS.CSharpStudy.Window.SDelegate.ProgramDescriptionDelegate.DescriptionDelegate pdelegate = null; pdelegate += pm.CsharpProgramer; pdelegate += pm.CProgramer; pdelegate -= pm.CProgramer; pm.Description("杨友山", pdelegate);
如许就只挪用pm.CsharpProgramer;一个要领了。
以上就是C#基础知识整顿 基础知识(20) 托付(一)的内容,更多相关内容请关注ki4网(www.ki4.cn)!