使用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#中使用委托、接口、匿名方法、泛型委托实现加减乘除算法的更多相关文章

  1. 委托学习笔记后续:泛型委托及委托中所涉及到匿名方法、Lambda表达式

    引言: 最初学习c#时,感觉委托.事件这块很难,其中在学习的过程中还写了一篇学习笔记:委托.事件学习笔记.今天重新温故委托.事件,并且把最近学习到和委托相关的匿名方法.Lambda表达式及泛型委托记录 ...

  2. 泛型委托及委托中所涉及到匿名方法、Lambda表达式

    泛型委托及委托中所涉及到匿名方法.Lambda表达式 引言: 最初学习c#时,感觉委托.事件这块很难,其中在学习的过程中还写了一篇学习笔记:委托.事件学习笔记.今天重新温故委托.事件,并且把最近学习到 ...

  3. .NET Framework System.Array.Sort 数组类,加深对 IComparer、IComparable 以及泛型委托、匿名方法、Lambda 表达式的理解

    本文内容 自定义类 Array.Sort 参考资料 System.Array.Sort 有很多对集合的操作,比如排序,查找,克隆等等,你可以利用这个类加深对 IComparer.IComparable ...

  4. 用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树

    这些对老一代的程序员都是老生常谈的东西,没什么新意,对新生代的程序员却充满着魅力.曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托,表达式树这些应用.今天我尝试用简单的方法叙述一下,让大家在五 ...

  5. 转帖:用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树

    用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树 这些对老一代的程序员都是老生常谈的东西,没什么新意,对新生代的程序员却充满着魅力.曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托 ...

  6. 泛型 System.Collections.Generic及泛型继承、运算符、结构、接口、方法、委托、事件、可空类型等

    一.定义泛型类 void Main() { //实例化泛型类时,才指定具体的类型 MyGenericClass<); Console.WriteLine(MyGeneri.InnerT1Obje ...

  7. c#委托、泛型委托和匿名方法

    题外话:别指望看第一遍书就能记住和掌握什么——请看第二遍.第三遍. 本人女猿一枚,2年工作经验,喜欢钻研,喜欢创新,闲暇之余喜欢写写博客,深知自身能力薄弱,如表达错误.不当之处请园友们多多指出,互相交 ...

  8. C#中分别对委托、匿名方法、Lambda表达式、Lambda表达式树以及反射执行同一方法的过程进行比较。

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  9. C# 委托、匿名方法、lambda简介

    在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个First不 ...

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

    一.匿名类型可通过使用 new 运算符和对象初始值创建匿名类型.示例:var v = new { Name = "Micro", Message = "Hello&quo ...

随机推荐

  1. 第六章 springboot + 事务

    在实际开发中,其实很少会用到事务,一般情况下事务用的比较多的是在金钱计算方面. mybatis与spring集成后,其事务该怎么做?其实很简单,直接在上一节代码的基础上在相应的方法(通常是servic ...

  2. 你必须了解的基础的 Linux 网络命令

    Linux 基础网络命令列表 我在计算机网络课程上使用 FreeBSD,不过这些 UNIX 命令应该也能在 Linux 上同样工作. 连通性 ping <host>:发送 ICMP ech ...

  3. PoEdu - C++阶段班【Po学校】- 第1课

    1 C++开讲 C ++  伟大的编程语言:能提高程序运行效率,节约更多的资源,"正确的使用C++,能够抑制全球变暖问题". 2 C++能力雷达图 通过 1效率 2灵活度 3 抽象 ...

  4. SILVERLIGHT 多维表头、复杂表头 MULTIPLE HEADER

    先上图, 众所周知,利用silverlight datagrid展示数据相当方便,但是想要弄出一个漂亮的表头却要费尽周折.此文的目的就是简要介绍一下利用第三方控件 C1.Silverlight.Fle ...

  5. 冒泡排序优化JAVA

    本文对传统的冒泡排序进行了一些优化,减少了循环次数. 时间复杂度 若文件的初始状态是正序的,一趟扫描即可完成排序.所需的关键字比较次数 C 和记录移动次数 M 均达到最小值: C(min)=n-1 , ...

  6. MySQL调优参数

    key_buffer_size 含义:用于索引块的缓冲区大小,增加它可得到更好处理的索引(对所有读和多重写). 影响:对于MyISAM表的影响不是很大,MyISAM会使用系统的缓存来存储数据,所以大量 ...

  7. [Leetcode][JAVA] Word Ladder II

    Given two words (start and end), and a dictionary, find all shortest transformation sequence(s) from ...

  8. 高性能的数据压缩库libzling

    libzling(https://github.com/richox/libzling)是一款高性能的数据压缩库,在压缩时间和压缩率上都超过了流行的zlib/gzip.libzling使用的是ROLZ ...

  9. Web 开发中 20 个很有用的 CSS 库

    转自:http://www.oschina.net/translate/css-libraries-for-developers 在过去的几年中,CSS已经成为一大部分开发者和设计者的最爱,因为它提供 ...

  10. .NET跨平台:在mac命令行下用vim手写ASP.NET 5 MVC程序

    昨天在 Mac 上手写了一个最简单的 ASP.NET 5 程序,直接在 Startup.cs 中通过 Response.WriteAsync() 输出响应内容,详见 .NET跨平台:在Mac上跟着错误 ...