假如在项目中,有多个方法,他们的开头和结尾都是差不多的,不变的只是中间的那部分逻辑。比如:

1
2
3
4
5
6
7
8
9
10
11
12
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");
        }

常规调用的话,写法为

1
2
f1();
f2();

那么如何复用公共部分呢?可以使用委托来实现。设计一个公共类,含有一个公有静态方法:

1
2
3
4
5
6
7
8
9
class Common
    {
        public static void f(Action action)
        {
            Console.WriteLine("begin");
            action();
            Console.WriteLine("end");
        }
    }

那么,调用的时候,只需要如下实现即可:

1
2
Common.f(() => Console.WriteLine("do something 1111!"));
Common.f(() => Console.WriteLine("do something 2222!"));

上述中,对于f1(),f2()方法的提取,有一个前提,就是f1(),f2()的输入参数是相同的(此处没有输入参数)。只有在这种输入参数一致的情况下,才能够用这种方法抽取出来。

那么对于任意输入参数的方法,如何提取公共部分呢?

一种方法是对公共的方法实现多个泛型参数的重载:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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");
        }
  }

根据实际需要,可以重载多个方法。这样的话,调用的时候也很方便。

假设如下方法:

1
2
3
4
5
6
7
8
9
10
11
12
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");
        }

输入参数是不同的。那么通过上面的方法抽取后,只需要如下写法就可以了。

1
2
Common.f<int>((i) => Console.WriteLine(i), 3);
Common.f<intstring>((i, s) => { Console.WriteLine(i); Console.WriteLine(s); }, 3, "www");

还有一种方法是使用Delegate类。

实现如下:

1
2
3
4
5
6
public static void f(Delegate exp, params dynamic[] d)
      {
          Console.WriteLine("begin");
          exp.DynamicInvoke(d);
          Console.WriteLine("end");
      }

代码中,使用Delegate类,通过DynamicInvoke方法实现对委托的调用。该方法更为简单。调用的时候只需要如下方式的代码即可:

1
2
3
4
Action<int> p = (a) => Console.WriteLine(a);
Action<intstring> 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的一个实例。

本文转自cnn23711151CTO博客,原文链接: http://blog.51cto.com/cnn237111/1205719,如需转载请自行联系原作者

C#中几种代码复用的方式相关推荐

  1. Spring RestTemplate中几种常见的请求方式GET请求 POST请求 PUT请求 DELETE请求

    Spring RestTemplate中几种常见的请求方式 原文地址: https://blog.csdn.net/u012702547/article/details/77917939 版权声明:本 ...

  2. java获取项目中的路径_java中几种获取项目路径方式

    转自http://caodaoxi.iteye.com/blog/1234805 在jsp和class文件中调用的相对路径不同. 在jsp里,根目录是WebRoot 在class文件中,根目录是Web ...

  3. zynq学习03 zynq中三种实现GPIO的方式

    http://m.blog.csdn.net/article/details?id=52123465 http://blog.chinaaet.com/songhuangong/p/43084 本文介 ...

  4. python中导入模块的方式_Python中几种导入模块的方式总结

    模块内部封装了很多实用的功能,有时在模块外部调用就需要将其导入.常见的方式有如下几种: 1 . import >>> import sys >>> sys.path ...

  5. python导入模块有几种_Python中几种导入模块的方式总结

    模块内部封装了很多实用的功能,有时在模块外部调用就需要将其导入.常见的方式有如下几种: 1 . import >>> import sys >>> sys.path ...

  6. Python中三种表示NA的方式

    Python中三种表示NA的方式 # -*- coding: utf-8 -*- import numpy as np import pandas as pd# data_frame = np.loa ...

  7. Hibernate中两种获取Session的方式

    转自:https://www.jb51.net/article/130309.htm Session:是应用程序与数据库之间的一个会话,是hibernate运作的中心,持久层操作的基础.对象的生命周期 ...

  8. unity3d中画线有几种方式_Spring RestTemplate中几种常见的请求方式

    原文 https://segmentfault.com/a/1190000011093597 在Spring Cloud中服务的发现与消费一文中,当我们从服务消费端去调用服务提供者的服务的时候,使用了 ...

  9. Spring RestTemplate中几种常见的请求方式

    关注公众号[江南一点雨],专注于 Spring Boot+微服务以及前后端分离等全栈技术,定期视频教程分享,关注后回复 Java ,领取松哥为你精心准备的 Java 干货! 在Spring Cloud ...

最新文章

  1. 2.3 使用 dom4j 对 xml文件进行 dom 解析
  2. 初识linux之文件管理
  3. python【力扣LeetCode算法题库】2-两数相加
  4. java 数据存储到什么地方?
  5. Java并发编程的基础-Thread.interrupted
  6. sql 如何根据月份查询数据总数_什么是慢查询?如何通过慢查询日志优化?
  7. C++ 内建函数对象
  8. SQL63 刷题通过的题目排名
  9. Mask R-CNN官方实现“又”来了!基于PyTorch,训练速度是原来2倍
  10. 硬件工程师面试基础知识点
  11. 阿里巴巴普惠_阿里巴巴的普惠字体来了,再也不用担心版权问题了。
  12. 五金模具设计统赢外挂提升效率技巧、外挂模具设计流程的问题归纳
  13. linux的pending状态怎么退出,状态pending是什么意思
  14. php定做单城市公交路线查询系统
  15. 内存管理基础学习笔记 - 4.2 缺页中断处理 - do_page_fault
  16. 巴拿赫空间的基本概念
  17. [软件]Safe3 Web漏洞扫描系统企业版v10.1 破解版
  18. iOS OC 计算代码执行耗时
  19. 李宏毅学习笔记40.GAN.番外篇
  20. SPI 及 NOR Flash 介绍

热门文章

  1. android点滴之PendingIntent的使用
  2. Oracle中查询rownum和rowid的区别
  3. [软件工程]在线教程
  4. 接口测试(apipost、jmeter和python脚本)
  5. java 富文本框_java-富文本(wangEditor框架)的使用教程
  6. Java国际化概念和使用介绍
  7. ceph auth get boostrap-osd_那些某橙色软件都能GET到手的有文凭粗粮 速速前来种草
  8. java解析xml报文_java 如何解析http请求返回的xml报文
  9. java连接weblogic数据源_使用weblogic数据源大全
  10. js 生成二维码_js 生成二维码