C#中使用委托、接口、匿名方法、泛型委托实现加减乘除算法
使用C#实现加减乘除算法经常被用作新手练习。本篇来分别体验通过委托、接口、匿名方法、泛型委托来实现。
使用委托实现
加减乘除拥有相同的参数个数、类型和返回类型,首先想到了使用委托实现。
//创建一个委托
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 []{' '}, );
var left = Decimal.Parse(elements[]);
var right = Decimal.Parse(elements[]);
var ope = elements[][]; 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("");
}
暂时这些。
C#中使用委托、接口、匿名方法、泛型委托实现加减乘除算法的更多相关文章
- 委托学习笔记后续:泛型委托及委托中所涉及到匿名方法、Lambda表达式
引言: 最初学习c#时,感觉委托.事件这块很难,其中在学习的过程中还写了一篇学习笔记:委托.事件学习笔记.今天重新温故委托.事件,并且把最近学习到和委托相关的匿名方法.Lambda表达式及泛型委托记录 ...
- 泛型委托及委托中所涉及到匿名方法、Lambda表达式
泛型委托及委托中所涉及到匿名方法.Lambda表达式 引言: 最初学习c#时,感觉委托.事件这块很难,其中在学习的过程中还写了一篇学习笔记:委托.事件学习笔记.今天重新温故委托.事件,并且把最近学习到 ...
- .NET Framework System.Array.Sort 数组类,加深对 IComparer、IComparable 以及泛型委托、匿名方法、Lambda 表达式的理解
本文内容 自定义类 Array.Sort 参考资料 System.Array.Sort 有很多对集合的操作,比如排序,查找,克隆等等,你可以利用这个类加深对 IComparer.IComparable ...
- 用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树
这些对老一代的程序员都是老生常谈的东西,没什么新意,对新生代的程序员却充满着魅力.曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托,表达式树这些应用.今天我尝试用简单的方法叙述一下,让大家在五 ...
- 转帖:用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树
用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树 这些对老一代的程序员都是老生常谈的东西,没什么新意,对新生代的程序员却充满着魅力.曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托 ...
- 泛型 System.Collections.Generic及泛型继承、运算符、结构、接口、方法、委托、事件、可空类型等
一.定义泛型类 void Main() { //实例化泛型类时,才指定具体的类型 MyGenericClass<); Console.WriteLine(MyGeneri.InnerT1Obje ...
- c#委托、泛型委托和匿名方法
题外话:别指望看第一遍书就能记住和掌握什么——请看第二遍.第三遍. 本人女猿一枚,2年工作经验,喜欢钻研,喜欢创新,闲暇之余喜欢写写博客,深知自身能力薄弱,如表达错误.不当之处请园友们多多指出,互相交 ...
- C#中分别对委托、匿名方法、Lambda表达式、Lambda表达式树以及反射执行同一方法的过程进行比较。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- C# 委托、匿名方法、lambda简介
在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个First不 ...
- C# 匿名委托、匿名方法、匿名对象、Lambda表达式
一.匿名类型可通过使用 new 运算符和对象初始值创建匿名类型.示例:var v = new { Name = "Micro", Message = "Hello&quo ...
随机推荐
- 咏南IOCP REST中间件
咏南IOCP REST中间件 让DELPHI7也能编写REST服务. 使用IOCP通信+UNIDAC数据库引擎. 客户端跨开发语言调用.
- 谷歌身份验证器加强Linux帐户安全
下载 Google的身份验证模块 # wget https://google-authenticator.googlecode.com/files/libpam-google-authenticato ...
- 状态机学习(三)解析JSON
来自 从零开始的 JSON 库教程 从零开始教授如何写一个符合标准的 C 语言 JSON 库 作者 Milo Yip https://zhuanlan.zhihu.com/json-tutorial ...
- iOS IPv6兼容支持和IPv6审核被拒收集整理
最近遇到一个大坑:IPv6审核被拒问题,于是广寻解决方案,先把一些可以用资料文档收集起来备用.也希望同行能用得着. 官方文档说明:Supporting IPv6 DNS64/NAT64 Network ...
- archlinux 安装mysql-workbench
archlinux packages 官方沒有提供 mysql-workbench的直接安裝包 在aur裏面可以找到, 使用yaourt -S mysql-workbench 這裏有個依賴ctempl ...
- ORACLE_簽核PROC帶游標
CREATE OR REPLACE PROCEDURE SP_C_TXYYMM(VAPPLY_NO IN VARCHAR2,VUSER_NM IN VARCHAR2,VFAC_NO IN VARCHA ...
- [转]moveTaskToback退后台
http://blog.csdn.net/dacainiao007/article/details/17352367 方法:public boolean moveTaskToBack(boolean ...
- linux-7 man 命令
man 命令的分类 man 命令 代码 代表内容 普通命令 内核调用的函数与工具 常见的函数与函数库 设备文件的说明 配置文件 游戏 惯例与协议 管理员可使用的命令 内核相关的文件 一般来讲帮助文档 ...
- 用命令提示符压缩文件,解压缩文件(不需要客户端安装7zip)
压缩成一个CAB包的办法: type list.txt (生成一个文件列表) makecab /f list.txt /d compressiontype=mszip /d compressionme ...
- [MFC] MFC 用mciSendString加载WAV资源文件
@ - @ FIRDST:为什么不用路径加载? 因为mciSendString函数不支持加载资源文件里的WAV资源,如果按路径加载,那么你的WAV就暴露在exe之外,无法实现音频资源的很好保护 ...