C#避免过长的IF和Switch分支的方法

1.最蠢形态

//很丑有没有!
//这个分支要是一两个还是可以接受的
class Program
{
static void Main(string[] args)
{
Command("播放");
Console.ReadKey();
} public static void Command(String _command)
{
switch(_command)
{
case "播放":
Console.WriteLine("开始"+_command+"了!!");
break;
case "快进":
Console.WriteLine("开始" + _command + "了!!");
break;
case "暂停":
Console.WriteLine("开始" + _command + "了!!");
break;
case "结束":
Console.WriteLine("开始" + _command + "了!!");
break;
}
}
}

2.表驱动形态

//这个表驱动 还可以利用反射去做
//这个比上面的强多了有没有?
class Program
{ public static Dictionary<string, Action> dic; static void Main(string[] args)
{
dic = new Dictionary<string, Action> {
{"播放", () => { Console.WriteLine("开始播放了!!"); }},
{"快进", () => { Console.WriteLine("开始快进了!!"); }},
{"暂停", () => { Console.WriteLine("开始暂停了!!");}}
};
//可以动态的添加命令和方法
dic.Add("结束", () => { Console.WriteLine("开始结束了!!"); });
Command(dic, "播放");
Command(dic, "快进");
Command(dic, "结束");
Command(dic, "快进两倍"); Console.ReadKey(); } static void Command(Dictionary<string, Action> _dic,String _command)
{
if (_dic.ContainsKey(_command))
{
_dic[_command]();
}
else
{
Console.WriteLine("没有命令啊!!");
}
}
}

3.多态形态

//利用多态来处理
//好处就是再添加命令时候不用修改,直接添加命令类就可以了
class Program
{
static void Main(string[] args)
{
Commander _commander = new PlayCommander();
_commander.Execute(); _commander = new FinishCommander();
_commander.Execute(); _commander = new SpeedCommander();
_commander.Execute(); Console.ReadKey();
}
} abstract class Commander
{
public abstract void Execute();
} class PlayCommander : Commander
{
public override void Execute()
{
Console.WriteLine("开始播放了了!!");
}
} class SpeedCommander : Commander
{
public override void Execute()
{
Console.WriteLine("开始快进了了!!");
}
} class PauseCommander : Commander
{
public override void Execute()
{
Console.WriteLine("开始暂停了了!!");
}
} class FinishCommander : Commander
{
public override void Execute()
{
Console.WriteLine("开始结束了了!!");
}
}

C#避免过长的IF和Switch分支的方法的更多相关文章

  1. 编写高质量代码改善C#程序的157个建议——建议149:使用表驱动法避免过长的if和switch分支

    建议149:使用表驱动法避免过长的if和switch分支 随着代码变得复杂,我们很容易被过长的if和switch分支困扰. 一个类枚举类型Week如下: enum Week { Monday, Tue ...

  2. 使用Arduino开发板连接干簧管(Reed Switch)的方法

    在现实生活中,干簧管(Reed Switch)有许多重要的应用,如磁性门开关.笔记本电脑.智能手机等.在本篇文章中,我们将了解一些干簧管的知识,并介绍如何使用Arduino开发板连接干簧管. 干簧管( ...

  3. Java基础知识强化19:Java中switch分支语句

    java中switch语句: 这里expression控制表达式的数据类型只能是byte.short.char.int四种整型类型和枚举类型,不能是boolean类型: Java7(1.7)改进了sw ...

  4. JAVA 长整型转换为IP地址的方法

    JAVA 长整型转换为IP地址的方法 代码例如以下: /** * 整型解析为IP地址 * @param num * @return */ public static String int2iP(Lon ...

  5. 02_5if switch分支与循环语句

    02_5if switch分支与循环语句 1.语句 1.1条件语句-根据不同条件,执行不同语句. if if ... else if ... else if if ... else if ... el ...

  6. C语言入门(11)——switch分支语句

    C语言提供了一种用于多分支选择的switch语句, 其一般形式为: switch(表达式) { case 常量表达式1:语句1; break; case 常量表达式2:语句2; break; .... ...

  7. php导出excel长数字串显示为科学计数方法与最终解决方法

    1.设置单元格为文本 $objPHPExcel = new PHPExcel(); $objPHPExcel->setActiveSheetIndex(0); $objPHPExcel-> ...

  8. CSU 1328 近似回文词【最长回文字符串(三种方法)】

    输入一行文本,输出最长近似回文词连续子串.所谓近似回文词是指满足以下条件的字符串: 1. S以字母开头,字母结尾 2. a(S)和b(S)最多有2k个位置不同,其中a(S)是S删除所有非字母字符并且把 ...

  9. PHP switch分支语句中省略break后还会执行其他case的原因分析

    请分析以下PHP代码的输出结果: $a= 'dog'; switch($a) { case 'cat': echo "\$a is cat"; case 'dog': echo & ...

随机推荐

  1. 深入javascript——构造函数和原型对象

    常用的几种对象创建模式 使用new关键字创建 最基础的对象创建方式,无非就是和其他多数语言一样说的一样:没对象,你new一个呀! var gf = new Object(); gf.name = &q ...

  2. hdu5358 First One(尺取法)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud First One Time Limit: 4000/2000 MS (Java/ ...

  3. Effective Java 电子书 apk版本下载

    下载安装包以后,安装即可阅读该书了,并且实时展示每章节代码哦,并且可以运行哦,赶快下载体验吧. Effective Java中文第二版下载地址:下载 应用截图:

  4. Fun with dynamicobject dynamic and the settings table

    What came before In my previous post I discussed ways of making the settings table using Generics to ...

  5. hdu 2034

    Problem Description 参加过上个月月赛的同学一定还记得其中的一个最简单的题目,就是{A}+{B},那个题目求的是两个集合的并集,今天我们这个A-B求的是两个集合的差,就是做集合的减法 ...

  6. c# 输出excel、word实例只需一行代码

    第一.首先下载 WindICFrameNet.dll 下载地址:http://pan.baidu.com/s/1dDBqC9r 第二.前台代码 <div style="display: ...

  7. DBA 思想天空笔记

    /*+leading(t1) use_nl(t2*/这个HINT的含义,其中use_nl表示强制用嵌套循环连接方式.Leading(t1)表示强制先访问t1表,也就是t1表作为驱动表,增加HINT的目 ...

  8. Codeforces 372B Counting Rectangles is Fun

    http://codeforces.com/problemset/problem/372/B 题意:每次给出一个区间,求里面有多少个矩形 思路:预处理,sum[i][j][k][l]代表以k,l为右下 ...

  9. myeclipse中控制台日志比实际晚8小时解决方法及java日志处理

    今天终于忍不住要解决myeclipse控制台中日志显示比实际晚8小时的问题,开始以为myeclipse编辑器时间问题,后来想想不对,myeclipse控制台打印的是tomcat的日志,随后以为是log ...

  10. Android核心基础(十)

    1.音频采集 你可以使用手机进行现场录音,实现步骤如下: 第一步:在功能清单文件AndroidManifest.xml中添加音频刻录权限: <uses-permission android:na ...