C#優(yōu)化if...else代碼的方案總結(jié)
前言
在編寫代碼實(shí)現(xiàn)業(yè)務(wù)需求過程中,會使用到大量的if...else 判斷語句。隨業(yè)務(wù)復(fù)雜程度不同,導(dǎo)致判斷語句出現(xiàn)多層嵌套、多分支等情況,導(dǎo)致代碼可讀性變差、增加維護(hù)難度。要減少、消除這種復(fù)雜的、面條式代碼,需要編寫代碼時(shí)多注意編程風(fēng)格,盡量規(guī)避if...else 的復(fù)雜化。學(xué)習(xí)一些代碼的優(yōu)化之道,培養(yǎng)自己的易讀、美觀代碼風(fēng)格。
方案
1、提前 return ,去除不必要的 else
缺點(diǎn):對較多的 if...else 沒什么大的效果。
示例:
#region 優(yōu)化前
if (string.IsNullOrEmpty(this.txtOrderNo.Text))
{
MessageBox.Show("訂單號不能為空,請輸入訂單號。");
this.txtOrderNo.Focus();
}
else
{
// 出處業(yè)務(wù)邏輯
}
#endregion
#region 優(yōu)化后
if (string.IsNullOrEmpty(this.txtOrderNo.Text))
{
MessageBox.Show("訂單號不能為空,請輸入訂單號。");
this.txtOrderNo.Focus();
return;
}
// 出處業(yè)務(wù)邏輯
#endregion2、使用條件三目運(yùn)算符
缺點(diǎn):對只有 一個(gè) if...esle 兩個(gè)選擇時(shí),才會有效果。如果有多個(gè)時(shí),閱讀理解會更費(fèi)力。
示例:
#region 優(yōu)化前
if ("CaiNiao".Equals(templateType, StringComparison.OrdinalIgnoreCase))
{
// 設(shè)置按鈕可見
this.btnCaiNiao.Visible = true;
}
else
{
// 設(shè)置按鈕不可見
this.btnCaiNiao.Visible = false;
}
#endregion
#region 優(yōu)化后
// 設(shè)置按鈕是否可見
this.btnCaiNiao.Visible = "CaiNiao".Equals(this.templateType, StringComparison.OrdinalIgnoreCase) ? true : false;
#endregion3、使用 switch
if...else 的使用場景,都能用 switch 代替,在分支選擇較多時(shí),盡量使用 switch。
示例:
#region 優(yōu)化前
if (keyValue==120)
{
// 按 F9 快捷鍵光標(biāo)定位到產(chǎn)品輸入框
this.txtProductNo.Focus();
}
else if (keyValue==121)
{
// 按 F10 快捷鍵光標(biāo)定位到訂單輸入框
this.txtOrderNo.Focus();
}
else if (keyValue==122)
{
// 按 F11 快捷鍵審核
this.ApproveOrder();
}
#endregion
#region 優(yōu)化后
switch (this.CurrentKeyValue)
{
case 120:
// 按 F9 快捷鍵光標(biāo)定位到產(chǎn)品輸入框
this.txtProductNo.Focus();
break;
case 121:
// 按 F10 快捷鍵光標(biāo)定位到訂單輸入框
this.txtOrderNo.Focus();
break;
case 122:
// 按 F11 快捷鍵審核
this.ApproveOrder();
break;
default:
break;
}
#endregion4、合并條件表達(dá)式
梳理和歸納邏輯判斷,使其變更為更簡單易懂的邏輯判斷代碼。
示例:
#region 優(yōu)化前
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 優(yōu)化后
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";
}
#endregion5、使用枚舉
將條件作為枚舉的值,這種可以避免使用大量的 if...else 語句。
示例:
#region 優(yōu)化前
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 優(yōu)化后
// 定義一個(gè)數(shù)據(jù)枚舉
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)
{
// 異常處理
}
#endregion6、使用字典
將條件作為字典的鍵,將處理方法作為字典的鍵值。這樣可以避免使用大量的 if...else 語句。
示例:
#region 優(yōu)化前
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 優(yōu)化后
// 定義一個(gè)數(shù)據(jù)字典
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小結(jié)
以上介紹了一些優(yōu)化 if...else 語句的方法,使代碼更加清晰、易于維護(hù)和擴(kuò)展。當(dāng)然還有其它優(yōu)化方法(可留言提供你的方法一起進(jìn)步)。希望本文的一些方法能為你帶來幫助。如有不到之處,請多多包涵。
相關(guān)文章
C#利用反射來判斷對象是否包含某個(gè)屬性的實(shí)現(xiàn)方法
這篇文章主要介紹了C#利用反射來判斷對象是否包含某個(gè)屬性的實(shí)現(xiàn)方法,很有借鑒價(jià)值的一個(gè)技巧,需要的朋友可以參考下2014-08-08
c#實(shí)現(xiàn)網(wǎng)站監(jiān)控查看是否正常示例
這篇文章主要介紹了使用c#監(jiān)控網(wǎng)站是否正常的功能示例,大家參考使用吧2014-01-01
C#發(fā)送和接收HTTP請求類HttpWebRequest的用法
這篇文章主要給大家介紹了關(guān)于C#發(fā)送和接收HTTP請求類HttpWebRequest用法的相關(guān)資料,C#中的HttpWebRequest是一個(gè)用于發(fā)送HTTP請求的類,它可以用于向Web服務(wù)器發(fā)送GET、POST、PUT、DELETE等請求,需要的朋友可以參考下2024-06-06
C#實(shí)現(xiàn)Excel合并單元格數(shù)據(jù)導(dǎo)入數(shù)據(jù)集詳解
這篇文章主要為大家詳細(xì)介紹了C#如何實(shí)現(xiàn)Excel合并單元格數(shù)據(jù)導(dǎo)入數(shù)據(jù)集,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01
將DLL放入到資源中,運(yùn)行時(shí)自動加載的小例子
這篇文章介紹了將DLL放入到資源中,運(yùn)行時(shí)自動加載的小例子,有需要的朋友可以參考一下2013-10-10

