减少if...的使用
最近维护一批代码,其中包括一堆if...的使用,多的情况嵌套8、9层,痛苦不堪,所以搜寻一些可以降低if...else的方法来改善一下代码,写个简单总结。

第一种:
优化前
if (measuredValue > 8)
return 5 * measuredValue * measuredValue - 3; if (measuredValue > 4)
return 4 * measuredValue - 2; if (measuredValue >= 0)
return 3 * measuredValue - 1; return 2 * measuredValue;
使用列表和linq优化后(摘自:https://www.linkedin.com/pulse/if-less-programming-c-jiri-pokorny)
using System;
using System.Linq; namespace ConsoleApp1
{
internal class Program
{
private static readonly MeasureTransform[] Transformations =
new MeasureTransform[]
{
// 这个顺序决定了判断先后顺序
new MeasureTransform(m => m > , m => * m * m - ),
new MeasureTransform(m => m > , m => * m - ),
new MeasureTransform(m => m >= , m => * m - ),
new MeasureTransform(m => true, m => * m)
}; private static void Main(string[] args)
{
var executor = Transformations.First(t => t.CanApply());
Console.Write(executor.Transform());
}
} internal class MeasureTransform
{
public MeasureTransform(Func<int, bool> canApply, Func<int, int> transform)
{
CanApply = canApply ?? throw new ArgumentNullException(nameof(canApply));
Transform = transform ?? throw new ArgumentNullException(nameof(transform));
}
public Func<int, bool> CanApply { get; set; }
public Func<int, int> Transform { get; set; }
}
}
第二种:使用逻辑运算符改善
using System;
using System.Linq; namespace ConsoleApp1
{
internal class Program
{ private static void Main(string[] args)
{
int a = ;
int b = ; // 优化前
if (a > )
{
if (b > )
{
Console.Write("");
}
} // 优化后
if (a > && b > )
{
Console.Write("");
}
}
}
}
第三种:从业务逻辑角度看看有没有多余的判断
using System;
using System.Linq; namespace ConsoleApp1
{
internal class Program
{ private static void Main(string[] args)
{
System.UInt32 a = ;
int b = (int)a + ; // 优化前
if (a > )
{
if (b > )
{
Console.Write("");
}
} // 优化后
if (a > )
{
Console.Write("");
}
}
}
}
第四种:使用三元运算符
优化前
namespace ConsoleApp1
{
internal class Program
{ private static void Main(string[] args)
{
System.UInt32 a = ;
uint c;
if (a > )
{
c = a;
}
else
{
c = a + ;
}
}
}
}
优化后
using System;
using System.Linq; namespace ConsoleApp1
{
internal class Program
{ private static void Main(string[] args)
{
System.UInt32 a = ;
int b = (int)a + ; // 优化前
var c = a > ? a : a + ; }
}
}
第五种:太多if..else if...效率低,使用switch...case...,也好看点。
第六种:从架构层面使用依赖注入,反射之类的,参考https://www.c-sharpcorner.com/forums/how-can-i-remove-multiple-if-statement。
减少if...的使用的更多相关文章
- Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)
Android XML shape 标签使用详解 一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...
- 初学seaJs模块化开发,利用grunt打包,减少http请求
原文地址:初学seaJs模块化开发,利用grunt打包,减少http请求 未压缩合并的演示地址:demo2 学习seaJs的模块化开发,适合对seajs基础有所了解的同学看,目录结构 js — —di ...
- 小小改动帮你减少bundle.js文件体积(翻译)
我已经从事过好多年的SPA开发工作,我发现很多的程序猿都从来不往 bundle.js 文件的体积上动脑筋,这让我有点懵逼. “安心洗路,等俺把代码混淆压缩后就一切666了”,若是有人这么说,我会翻白眼 ...
- Effective前端5:减少前端代码耦合
什么是代码耦合?代码耦合的表现是改了一点毛发而牵动了全身,或者是想要改点东西,需要在一堆代码里面找半天.由于前端需要组织js/css/html,耦合的问题可能会更加明显,下面按照耦合的情况分别说明: ...
- LVM 管理减少swap分区空间增加到根分区
简介 LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制,它由Heinz Mauelshagen在Linux 2.4内核上实现 ...
- Arduino下LCD1602综合探究(下)——如何减少1602的连线,LiquidCrystal库,LiquidCrystal库中bug的解决方法
一.前言: 上文中,笔者系统的阐述了1602的两种驱动方式,并简单的提到了Arduino的LiquidCrystal库.本文紧接上文,对以下两个问题进行更加深入的探讨:如何能够使1602对Arduin ...
- SQL Server SQL性能优化之--pivot行列转换减少扫描计数优化查询语句
原文出处:http://www.cnblogs.com/wy123/p/5933734.html 先看常用的一种表结构设计方式: 那么可能会遇到一种典型的查询方式,主子表关联,查询子表中的某些(或者全 ...
- FindBugs 入门——帮你减少代码中的bug数
FindBugs 入门 FindBugs 作用 开发人员在开发了一部分代码后,可以使用FindBugs进行代码缺陷的检查.提高代码的质量,同时也可以减少测试人员给你报的bug数. 代码缺陷分类 根据缺 ...
- CDN的combo技术能把多个资源文件合并引用,减少请求次数
CDN的combo技术能把多个资源文件合并引用,减少请求次数.比如淘宝的写法: <link rel="stylesheet" href="//g.alicdn.co ...
- 【前端开发】优化代码之减少引入,css预编译语言的优点,stylus的使用
前言:我必须得承认在最最最开始的时候,我对于css的预编译是非常不以为然的,这是错误的.一般在页面编写过程中,我会将需要reset的css放在reset.css中,讲会需要重复用到的放置到public ...
随机推荐
- java -> 异常类与自定义异常
异常 什么是异常?Java代码在运行时期发生的问题就是异常. 在Java中,把异常信息封装成了一个类.当出现了问题时,就会创建异常类对象并抛出异常相关的信息(如异常出现的位置.原因等). 异常的继承体 ...
- mybatis 自动生成代码工具
配置官网: http://www.mybatis.org/generator/configreference/xmlconfig.html 源码:https://github.com/mybatis/ ...
- 【Android】是时候为你的应用加上WebDav同步了
WebDav是什么? WebDAV (Web-based Distributed Authoring and Versioning) 一种基于 HTTP 1.1协议的通信协议.它扩展了HTTP 1.1 ...
- 学习Echarts:(二)异步加载更新
这部分比较简单,对图表的异步加载和更新,其实只是异步获取数据然后通过setOption传入数据和配置而已. $.get('data.json').done(function (data) { myCh ...
- 利用Python科学计算处理物理问题(和物理告个别)
背景: 2019年初由于尚未学习量子力学相关知识,所以处于自学阶段.浅显的学习了曾谨言的量子力学一卷和格里菲斯编写的量子力学教材.注重将量子力学的一些基本概念了解并理解.同时老师向我们推荐了Quant ...
- python3.x 基础四:目录获取及目录规范
1.获取目录 import os,sys print('程序文件运行相对位置>>',os.path.abspath(__file__)) print('程序文件上级绝对目录>> ...
- Mysql 查询指令 1
一.查询两个时间字段相减的差值 >>> (TIME_TO_SEC(时间字段一) select bl_no, task_result, carrier_code, task_start ...
- Nginx是如何处理一个请求
首先,nginx在启动时,会解析配置文件,得到需要监听的端口与ip地址,然后在nginx的master进程里面,先初始化好这个监控的socket(创建socket,设置addrreuse等选项,绑定到 ...
- Jquery toggle
toggle:切换显示 如 <script> $(document).ready(function(){ $("button").click(function(){ $ ...
- MySQL递归查询
MySQL8.0已经支持CTE递归查询,举例说明 CREATE TABLE EMP (EMPNO integer NOT NULL, ENAME ), JOB ), MGR integer, HIRE ...