使用委托实现

加减乘除拥有相同的参数个数、类型和返回类型,首先想到了使用委托实现。

//创建一个委托
public delegate decimal MathOperation(decimal left, decimal right);//创建方法参数和返回结果符合委托的定义
public static decimal Add(decimal left, decimal right)
{return left + right;
}public static decimal Subtract(decimal left, decimal right)
{return left - right;
}public static decimal Multiply(decimal left, decimal right)
{return left * right;
}public static decimal Divide(decimal left, decimal right)
{return left / right;
}//返回委托类型
private static MathOperation GetOperation(char oper)
{switch(oper){case '+': return Add;case '-': return Subtract;case '*': return Multiply;case '/': return Divide;}throw new NotSupportedException("");
}//封装一个方法用来把操作数和符号考虑进来,返回委托类型
private static decimal Eval(string expr)
{var elements = expr.Split(new []{' '}, 3);var left = Decimal.Parse(elements[0]);var right = Decimal.Parse(elements[1]);var ope = elements[2][0];return GetOperation(op)(left, right);
}void Main()
{Console.WriteLine(Eval("1 3 +"));
}

使用接口实现

以上,委托用在了方法层面。如果在类层面,也可用接口封装加减乘除的共性。

public interface IMathOperation
{decimal Compute(decimal left, decimal right);
}public class AddOperation : IMathOperation
{decimal Compute(decimal left, decimal right){return left + right;}
}public class SubtractOperation : IMathOperation
{decimal Compute(decimal left,, decimal right){return left - right;}
}public class MultiplyOperation : IMathOperation
{decimal Compute(decimal left, decimal right){return left * right;}
}public class DivideOperation : IMathOperation
{decimal Compute(decimal left, decimal right){return left/right;}
}//获取接口类型
private static IMathOperation GetOperation(char oper)
{switch(oper){case '+': return new AddOperation();case '-': return new SubtractOperation();case '*': return new MultiplyOperation();case '/': return new DivideOperation();}throw new NotSupportedException("");
}...

使用匿名方法

委托还可以结合匿名方法一起使用

public delegate decimal MathOperation(decimal left, decimal right);private static MathOperation GetOperation(char oper)
{switch(oper){case '+': return delgate(decimal left, decimal right) {return left + right;};case '-': return delgate(decimal left, decimal right) {return left - right;};case '*': return delgate(decimal left, decimal right) {return left * right;};case '/': return delgate(decimal left, decimal right) {return left / right;};}throw new NotSupportedException("");
}

泛型委托

而用泛型委托实现更简洁。

private static Func<decimal, decimal, decimal> GetOperation(char oper)
{switch(oper){case '+': return (left, right) => left + right;case '-': return (left, right) => left - right;case '*': return (left, right) => left * right;case '/': return (left, right) => left / right;}throw new NotSupportedExcepton("");
}

转载于:https://www.cnblogs.com/shy1766IT/p/5490992.html

分别使用委托、接口、匿名方法、泛型委托实现加减乘除运算相关推荐

  1. 委托、lamda表达式..委托概念-匿名函数-泛型委托-Lamda表达式-多播委托

    委托 一.什么是委托? 将一个方法作为参数传递给另一个方法(参数类型为委托delegate).   声明一个委托类型. 委托所指向的函数必须跟委托具有相同的的签名(参数个数.参数类型.返回值一样). ...

  2. C#泛型委托,匿名方法,匿名类

    C#泛型委托,匿名方法,匿名类 class Test{delegate K proxy<T, K>(T t, K k); //泛型委托,注意返回值的写法,返回值的类型K先于其声明proxy ...

  3. C# 匿名委托、匿名方法、匿名对象、Lambda表达式

    C# 匿名委托.匿名方法.匿名对象.Lambda表达式 原文:C# 匿名委托.匿名方法.匿名对象.Lambda表达式 一.匿名类型 可通过使用 new 运算符和对象初始值创建匿名类型. 示例: var ...

  4. C# 从CIL代码了解委托,匿名方法,Lambda 表达式和闭包本质

    前言 C# 3.0 引入了 Lambda 表达式,程序员们很快就开始习惯并爱上这种简洁并极具表达力的函数式编程特性. 本着知其然,还要知其所以然的学习态度,笔者不禁想到了几个问题. (1)匿名函数(匿 ...

  5. 高阶函数、委托与匿名方法

    高阶函数.委托与匿名方法 高阶函数.委托与匿名方法 作者 赵劼 发布于 2009年4月17日 下午6时35分 高阶函数(higher-order function)是指把另一个函数作为参数或返回值的函 ...

  6. 第五节:泛型(泛型类、接口、方法、委托、泛型约束、泛型缓存、逆变和协变)

    一. 泛型诞生的背景 在介绍背景之前,先来看一个案例,要求:分别输出实体model1.model2.model3的id和name值,这三个实体有相同的属性名字id和name. 1 public cla ...

  7. C语言中的函数指针、函数的直接/间接调用、C# 委托(自定义委托、内置泛型委托、委托的实例化、委托的一般使用(模板方法、回调方法)、泛型委托、多播委托、同步/异步使用委托)

    文章目录 C语言中的函数指针 函数的直接调用与间接调用 Java中没有与委托对应的功能实体 C# 委托 C# 自定义委托类型 C# 内置泛型委托类型 委托的实例化 委托也支持泛型的使用 委托的一般使用 ...

  8. .NET中委托写法的演变(上):委托与匿名方法

    可能有一件事情需要说在前面,那就是:委托本身其实从来没有改变过,改变的一直都是委托的"写法".因此更确切地说,改变的只是"编译器".而本文所有内容都用C#来实现 ...

  9. C# 委托,匿名方法,lambda表达式使用方法

    在 2.0 之前的 C# 版本中,声明委托的唯一方法是使用命名方法. C# 2.0 引入了匿名方法,而在 C# 3.0 及更高版本中,Lambda 表达式取代了匿名方法,作为编写内联代码的首选方式. ...

  10. c#4.0捷径教程委托、匿名方法和事件笔记

    从代码层面上来说是,事件触发了回调,在CLR中委托是目前实现回调的首选的方法,把委托理解成一个指向函数的指针是有帮助的.这个函数可以是静态的也可以实例的,委托实际上和thunk一样的,唯 一不同的在c ...

最新文章

  1. ant 接口返回文件流,前端自动下载实现
  2. oracle断电 ora01110,oracle在做备份的时候断电
  3. 卸载LINUX自带的JDK——linux-jdk-java
  4. RAC 核心概念 Cache Fusion
  5. 各种门锁的内部结构图_便宜超好用:小米智能门锁 E上手体验报告
  6. 将图片文件通过byte[]字节数组Base64加密后给前端显示
  7. PHOTOSHOP常用快捷键了
  8. centos压缩和解压缩命令之zip
  9. 【转】史上最简单的软件破解——5行脚本代码完美破解99%的过期软件
  10. stm32通过SPI与adc124s021通信读取ad
  11. 多功能工具箱微信小程序源码
  12. 量化基金投资之Alpha策略简介
  13. android 双击返回键退出 拦截menu键
  14. 【论文阅读】Whisper: Robust Speech Recognition via Large-Scale Weak Supervision
  15. win10怎么更新显卡驱动_Intel发布核显新驱动:支持Win10 H2更新、11代酷睿狂喜-Intel,核显,驱动,Win10 ——快科技(驱动之家旗下媒体)-...
  16. 大数据信息时代,如何防止数据泄露,大数据防泄漏解决方案
  17. 姓名如果取得好,也能趋吉避凶
  18. 云和恩墨数据库MogDB荣获2021年度IT168最佳创新产品奖
  19. Hi-Fi小经验(转)
  20. java中jar文件

热门文章

  1. DIV周边添加投影及背景固定
  2. windows x64 build c++ poco库
  3. 第49周星期二PD数据库逆向工程
  4. JSP学习02-config内置对象
  5. WPF——微软的UI革命
  6. Javascript Symbol 隐匿的未来之星
  7. PHP支付宝接口RSA验证
  8. 天气情况(思维,dp思想)
  9. VMware宋家瑜:U2VL要趁早
  10. Revit二次开发之“使用ElementTransformUtils.MoveElement()移动元素”