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 ...
随机推荐
- Java.web-application-development-environments-for-macosx
Java Web Application开发 1 下载需要的软件 使用的软件并没有采用最新的版本,只是采用了次新版本. 1.1 下载Eclipse的jee版本 eclipse-jee-luna-SR2 ...
- XML文件操作(C#)
XML应用于Web开发的许多方面,常用于简化数据的存储和共享,它的设计宗旨是传输数据,而非显示数据.下面简单介绍一下C#是如何对XML文件进行读取的. 1.首先,建立XML对象并关联XML文件 str ...
- sqlserver,mysql,oracle通用的模拟和改进的全文搜索算法
问:数据库效率最低的地方是什么? 答:表扫描 问:表扫描常见的情况是 答:like '%a%' 这类查询 如果使用全文检索引擎,又无法满足我们的需求的时候怎么办,比如要从 一个商品名称 "农 ...
- 20145225唐振远 《Java程序设计》第1周学习总结——小试牛刀
20145225唐振远<Java程序设计>第1周学习总结——小试牛刀 教材学习内容总结 1.java语言概述:一门高级编程语言. 2.java语言的三种技术构架:java SE.java ...
- C# winform 代码生成
http://www.cnblogs.com/luomingui/archive/2012/09/02/2667217.html 双鱼林: http://www.crsky.com/soft/4941 ...
- tomcat 支持ssi功能配置
1.SSI是Server Side Includes 的缩写,是嵌入到HTML页面的一组指令的集合.在返回请求的页面(包含SSI指令前),服务器会处理这些指令,并用处理的结果替换指令,然后把页面返回. ...
- js常用功能汇总
var Utils = function() { this.Tools; this.ui; }; Utils = new Utils(); Utils.prototype.Tools = { year ...
- 将html页改成jsp的两种方式
将html页改成jsp的两种方式 作者: 字体:[增加 减小] 类型:转载 时间:2013-08-13 将html页改成jsp有两种方法,第一种是直接修改html文件,另一种是新建jsp文件.下面为大 ...
- Html.DropDownList 选中 mvc view 弱类型
List<Model.SysGroup> listGroup = sysGroupBll.Where(o => o.IsSb == true, o => o.Id).ToLis ...
- 如何让chrome始终运行插件
使用chrome可能有时候会拦截比如阿里旺旺和腾讯等的登录插件,那么怎么才始终允许,而不需要每次确认呢.下面. 1. 打开Chrome浏览器. 在地址栏中输入 chrome://plugins 回车 ...