假如在项目中,有多个方法,他们的开头和结尾都是差不多的,不变的只是中间的那部分逻辑。比如:
目前成都创新互联已为千余家的企业提供了网站建设、域名、网络空间、网站托管、服务器租用、企业网站设计、海珠网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。static void f1() { Console.WriteLine("begin"); Console.WriteLine("do something1!"); Console.WriteLine("end"); } static void f2() { Console.WriteLine("begin"); Console.WriteLine("do something2!"); Console.WriteLine("end"); }
常规调用的话,写法为
f1(); f2();
那么如何复用公共部分呢?可以使用委托来实现。设计一个公共类,含有一个公有静态方法:
class Common { public static void f(Action action) { Console.WriteLine("begin"); action(); Console.WriteLine("end"); } }
那么,调用的时候,只需要如下实现即可:
Common.f(() => Console.WriteLine("do something 1111!")); Common.f(() => Console.WriteLine("do something 2222!"));
上述中,对于f1(),f2()方法的提取,有一个前提,就是f1(),f2()的输入参数是相同的(此处没有输入参数)。只有在这种输入参数一致的情况下,才能够用这种方法抽取出来。
那么对于任意输入参数的方法,如何提取公共部分呢?
一种方法是对公共的方法实现多个泛型参数的重载:
class Common { public static void f(Action action) { Console.WriteLine("begin"); action(); Console.WriteLine("end"); } public static void f<T1>(Action<T1> action,T1 arg1) { Console.WriteLine("begin"); action(arg1); Console.WriteLine("end"); } public static void f<T1, T2>(Action<T1, T2> action, T1 arg1, T2 arg2) { Console.WriteLine("begin"); action(arg1, arg2); Console.WriteLine("end"); } }
根据实际需要,可以重载多个方法。这样的话,调用的时候也很方便。
假设如下方法:
static void f1(int i) { Console.WriteLine("begin"); Console.WriteLine(i); Console.WriteLine("end"); } static void f2(int i, string s) { Console.WriteLine("begin"); Console.WriteLine(i); Console.WriteLine(s); Console.WriteLine("end"); }
输入参数是不同的。那么通过上面的方法抽取后,只需要如下写法就可以了。
Common.f<int>((i) => Console.WriteLine(i), 3); Common.f<int, string>((i, s) => { Console.WriteLine(i); Console.WriteLine(s); }, 3, "www");
还有一种方法是使用Delegate类。
实现如下:
public static void f(Delegate exp, params dynamic[] d) { Console.WriteLine("begin"); exp.DynamicInvoke(d); Console.WriteLine("end"); }
代码中,使用Delegate类,通过DynamicInvoke方法实现对委托的调用。该方法更为简单。调用的时候只需要如下方式的代码即可:
Action<int> p = (a) => Console.WriteLine(a); Action<int, string> p2 = (a, s) => { Console.WriteLine(a); Console.WriteLine(s); }; Common.f(p, 3); Common.f(p2, 3,"ww");
注意:Delegate 类 (Delegate class)并不是delegate类型(delegate type).Delegate class是用来获取delegate type的一个类。可以认为delegate type是Delegate class的一个实例。
创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。
文章名称:C#中几种代码复用的方式-创新互联
转载注明:https://www.cdcxhl.com/article22/csdejc.html
成都网站建设公司_创新互联,为您提供营销型网站建设、定制网站、搜索引擎优化、静态网站、企业网站制作、定制开发
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联