C#优化if...else代码的方案总结

 更新时间:2024年06月16日 09:42:20   作者:码农浩克  
在编写代码实现业务需求过程中,会使用到大量的if...else 判断语句,随业务复杂程度不同,导致判断语句出现多层嵌套、多分支等情况,导致代码可读性变差、增加维护难度,本文介绍了C# 如何优化 if...else 让代码优雅起来,需要的朋友可以参考下

前言

在编写代码实现业务需求过程中,会使用到大量的if...else 判断语句。随业务复杂程度不同,导致判断语句出现多层嵌套、多分支等情况,导致代码可读性变差、增加维护难度。要减少、消除这种复杂的、面条式代码,需要编写代码时多注意编程风格,尽量规避if...else 的复杂化。学习一些代码的优化之道,培养自己的易读、美观代码风格。

方案

1、提前 return ,去除不必要的 else

缺点:对较多的 if...else 没什么大的效果。

示例:

#region 优化前
if (string.IsNullOrEmpty(this.txtOrderNo.Text))
{
    MessageBox.Show("订单号不能为空,请输入订单号。");
    this.txtOrderNo.Focus();
}
else
{
    // 出处业务逻辑
}
#endregion


#region 优化后
if (string.IsNullOrEmpty(this.txtOrderNo.Text))
{
    MessageBox.Show("订单号不能为空,请输入订单号。");
    this.txtOrderNo.Focus();
    return;
}
// 出处业务逻辑
#endregion

2、使用条件三目运算符

缺点:对只有 一个 if...esle 两个选择时,才会有效果。如果有多个时,阅读理解会更费力。

示例:

#region 优化前
if ("CaiNiao".Equals(templateType, StringComparison.OrdinalIgnoreCase))
{
    // 设置按钮可见
    this.btnCaiNiao.Visible = true;
}
else
{
    // 设置按钮不可见
    this.btnCaiNiao.Visible = false;
}
#endregion


#region 优化后
// 设置按钮是否可见
this.btnCaiNiao.Visible = "CaiNiao".Equals(this.templateType, StringComparison.OrdinalIgnoreCase) ? true :  false;
#endregion

3、使用 switch

if...else 的使用场景,都能用 switch 代替,在分支选择较多时,尽量使用 switch。

示例:

#region 优化前
if (keyValue==120)
{
    // 按 F9 快捷键光标定位到产品输入框
    this.txtProductNo.Focus();
}
else if (keyValue==121)
{
    // 按 F10 快捷键光标定位到订单输入框
    this.txtOrderNo.Focus();
}
else if (keyValue==122)
{
    // 按 F11 快捷键审核
    this.ApproveOrder();
}
#endregion


#region 优化后
switch (this.CurrentKeyValue)
{
    case 120:
        // 按 F9 快捷键光标定位到产品输入框
        this.txtProductNo.Focus();
        break;
    case 121:
        // 按 F10 快捷键光标定位到订单输入框
        this.txtOrderNo.Focus();
        break;
    case 122:
        // 按 F11 快捷键审核
        this.ApproveOrder();
        break;
    default:
        break;
}
#endregion

4、合并条件表达式

梳理和归纳逻辑判断,使其变更为更简单易懂的逻辑判断代码。

示例:

#region 优化前
string expressCode ="DOUYIN-YTO"
string templateurl=string.Empty;
string[] splitCode = expressCode..Split('-');
if (splitCode.Length >= 2)
{
    if (expressCode.Contains(splitCode[1]))
    {
        templateurl="http://url.com/test.html"
    }
}
#endregion


#region 优化后
string expressCode = "DOUYIN-YTO";
string templateurl = string.Empty;
string[] splitCode = expressCode.Split('-');
if (splitCode.Length >= 2 &&  expressCode.Contains(splitCode[1]))
{
    templateurl = "http://url.com/test.html";
}
#endregion

5、使用枚举

将条件作为枚举的值,这种可以避免使用大量的 if...else 语句。

示例:

#region 优化前
int  platformID = 0;
string platformCode ="DOUYIN";
if ("PINDUODUO".Equals(platformCode, StringComparison.OrdinalIgnoreCase))
{
    platformID = 1;
}
else if ("DOUYIN".Equals(platformCode, StringComparison.OrdinalIgnoreCase))
{
    platformID = 2;
}
else if ("KUAISHOU".Equals(platformCode, StringComparison.OrdinalIgnoreCase))
{
    platformID = 3;
}
else if ("SHIPINHAO".Equals(platformCode, StringComparison.OrdinalIgnoreCase))
{
    platformID = 4;
}
else if ("AIKUCUN".Equals(platformCode, StringComparison.OrdinalIgnoreCase))
{
    platformID = 5;
}
else if ("XIAOHONGSHU".Equals(platformCode, StringComparison.OrdinalIgnoreCase))
{
    platformID = 6;
}
#endregion


#region 优化后
// 定义一个数据枚举
public enum Platform
{
    PINDUODUO=1,
    DOUYIN,
    KUAISHOU,
    SHIPINHAO,
    AIKUCUN,
    XIAOHONGSHU
}
Platform platform;
bool result=Enum.TryParse<Platform>("SHIPINHAO", out platform);
int platformID = Convert.ToInt32(platform);
// 需判断SHIPINHAO是否枚举
if (platformID==0)
{
    // 异常处理
}
#endregion

6、使用字典

将条件作为字典的键,将处理方法作为字典的键值。这样可以避免使用大量的 if...else 语句。

示例:

#region 优化前
int  platformID = 0;
string platformCode ="DOUYIN";
if ("PINDUODUO".Equals(platformCode, StringComparison.OrdinalIgnoreCase))
{
    platformID = 1;
}
else if ("DOUYIN".Equals(platformCode, StringComparison.OrdinalIgnoreCase))
{
    platformID = 2;
}
else if ("KUAISHOU".Equals(platformCode, StringComparison.OrdinalIgnoreCase))
{
    platformID = 3;
}
else if ("SHIPINHAO".Equals(platformCode, StringComparison.OrdinalIgnoreCase))
{
    platformID = 4;
}
else if ("AIKUCUN".Equals(platformCode, StringComparison.OrdinalIgnoreCase))
{
    platformID = 5;
}
else if ("XIAOHONGSHU".Equals(platformCode, StringComparison.OrdinalIgnoreCase))
{
    platformID = 6;
}
#endregion


#region 优化后
// 定义一个数据字典
Dictionary<string,int> platformDictionary = new Dictionary<string,int>();
platformDictionary.Add("PINDUODUO",1);
platformDictionary.Add("DOUYIN", 2);
platformDictionary.Add("KUAISHOU", 3);
platformDictionary.Add("SHIPINHAO", 4);
platformDictionary.Add("AIKUCUN", 5);
platformDictionary.Add("XIAOHONGSHU", 6);


int platformID = 0;
string platformCode = "DOUYIN";
if (platformDictionary.ContainsKey(platformCode))
{
    platformID = platformDictionary[platformCode];
}
#endregion

小结

以上介绍了一些优化 if...else 语句的方法,使代码更加清晰、易于维护和扩展。当然还有其它优化方法(可留言提供你的方法一起进步)。希望本文的一些方法能为你带来帮助。如有不到之处,请多多包涵。

相关文章

  • C#高效实现复制Word文档内容

    C#高效实现复制Word文档内容

    在日常办公或企业级文档处理中,我们经常需要复制 Word 文档的内容,本文将基于 Free Spire.Doc for .NET 免费库,详细介绍如何在 C# 中实现 Word 内容的复制,希望对大家有所帮助
    2026-03-03
  • C#中使用Cache框架快速实现Cache操作

    C#中使用Cache框架快速实现Cache操作

    这篇文章介绍了C#中使用Cache框架快速实现Cache操作的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • VS2010写的程序在自己电脑可以运行、其他电脑上不能运行的解决方案

    VS2010写的程序在自己电脑可以运行、其他电脑上不能运行的解决方案

    自己用Visual Studio 2010 旗舰版写了一个软件,在自己电脑上运行完全没有问题,但是拷贝到其他人电脑上之后不管双击还是以管理身份运行,均没有反应,进程管理器中相关进程也只是一闪而过
    2013-04-04
  • Unity实现简单虚拟摇杆

    Unity实现简单虚拟摇杆

    这篇文章主要为大家详细介绍了Unity实现简单虚拟摇杆,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C#字符串加密解密方法实例

    C#字符串加密解密方法实例

    这篇文章主要介绍了C#字符串加密解密方法,实例分析了C#对字符串加密与解密的操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • C# Email发送邮件 对方打开邮件可获得提醒

    C# Email发送邮件 对方打开邮件可获得提醒

    这篇文章主要为大家详细介绍了C# Email发送邮件功能,对方打开通知你,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • C#调用FFplay实现播放视频功能

    C#调用FFplay实现播放视频功能

    这篇文章主要为大家详细介绍了C#如何调用FFplay实现播放视频功能,文中的示例代码讲解详细,具有一定的参考价值,有需要的小伙伴可以跟随小编一起学习一下
    2023-10-10
  • C# 泛型接口的抗变和协变

    C# 泛型接口的抗变和协变

    本篇文章主要介绍了C#中泛型接口的抗变和协变的相关知识。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-03-03
  • C#把数组中的某个元素取出来放到第一个位置的实现方法

    C#把数组中的某个元素取出来放到第一个位置的实现方法

    这篇文章主要介绍了C#把数组中的某个元素取出来放到第一个位置的实现方法,涉及C#针对数组的常见操作技巧,非常具有实用价值,需要的朋友可以参考下
    2014-12-12
  • C#实现窗体间传递数据实例

    C#实现窗体间传递数据实例

    这篇文章主要介绍了C#实现窗体间传递数据实例,需要的朋友可以参考下
    2014-07-07

最新评论