C#條件語(yǔ)句消除或簡(jiǎn)化減少的九種方法
前言
在你的編程生活中,一定少不了跟條件語(yǔ)句打交道,但是條件語(yǔ)句用得多了,你會(huì)發(fā)現(xiàn)程序變得越來(lái)越復(fù)雜,測(cè)試時(shí)經(jīng)常會(huì)漏掉一些分支,而且大量的 if-else 語(yǔ)句閱讀起來(lái)理解非常困難,維護(hù)起來(lái)也特別困難!
所以減少或簡(jiǎn)化條件語(yǔ)句不僅能提高代碼的可讀性,還能降低維護(hù)成本和減少潛在的錯(cuò)誤。
我總結(jié)了 9 個(gè)消除或簡(jiǎn)化減少 C# 條件語(yǔ)句的小技巧,希望它們能為你的編程旅程增添一份靈感,讓你的代碼更加簡(jiǎn)潔優(yōu)雅,從此告別那些令人頭疼的條件語(yǔ)句迷宮!
1. 使用多態(tài)
通過(guò)多態(tài),將條件邏輯分散到不同的類中,從而減少 if 或 switch 語(yǔ)句。
優(yōu)點(diǎn):避免了 if 或 switch 語(yǔ)句,代碼更易擴(kuò)展。
示例:
// 定義一個(gè)抽象基類
abstract class Animal
{
public abstract void MakeSound();
}
// 派生類實(shí)現(xiàn)具體行為
class Dog : Animal
{
public override void MakeSound()
{
Console.WriteLine("Woof!");
}
}
class Cat : Animal
{
public override void MakeSound()
{
Console.WriteLine("Meow!");
}
}
// 使用多態(tài)代替條件語(yǔ)句
Animal myAnimal = new Dog();
myAnimal.MakeSound(); // 輸出: Woof!
myAnimal = new Cat();
myAnimal.MakeSound(); // 輸出: Meow!
2. 字典映射
將條件邏輯映射到字典中,用鍵值對(duì)代替 switch 或 if-else。
優(yōu)點(diǎn):代碼更簡(jiǎn)潔,易于擴(kuò)展新的操作。
public string GetDayOfWeek(int dayNumber)
{
var days = new Dictionary<int, string>
{
{ 1, "星期一" },
{ 2, "星期二" },
{ 3, "星期三" },
{ 4, "星期四" },
{ 5, "星期五" },
{ 6, "星期六" },
{ 7, "星期日" }
};
return days.TryGetValue(dayNumber, out var day) ? day : "無(wú)效的天數(shù)";
}
3. ?? 和 ?. 運(yùn)算符
這兩個(gè)運(yùn)算符可以簡(jiǎn)化空值檢查和默認(rèn)值賦值。
優(yōu)點(diǎn):減少 if 語(yǔ)句,代碼更簡(jiǎn)潔。
string name = null; // 使用空合并運(yùn)算符(??)提供默認(rèn)值 string displayName = name ?? "Guest"; Console.WriteLine(displayName); // 輸出: Guest // 使用空條件運(yùn)算符(?.)避免空引用異常 int? length = name?.Length; Console.WriteLine(length ?? 0); // 輸出: 0
4. 三元運(yùn)算符(?:)
可以簡(jiǎn)化簡(jiǎn)單的 if-else 語(yǔ)句。
優(yōu)點(diǎn):?jiǎn)涡泻?jiǎn)單條件判斷,避免多行代碼。
示例:
int age = 20; // 使用三元運(yùn)算符代替 if-else string status = age >= 18 ? "Adult" : "Minor"; Console.WriteLine(status); // 輸出: Adult
5. 策略模式
將不同的行為封裝到獨(dú)立的策略類中,避免條件語(yǔ)句。
優(yōu)點(diǎn):避免條件語(yǔ)句,易于擴(kuò)展新的策略。
// 策略接口
public interface IDiscountStrategy
{
double CalculateDiscount(double amount);
}
// 幾個(gè)策略實(shí)現(xiàn)
public class NoDiscount : IDiscountStrategy
{
public double CalculateDiscount(double amount) => 0;
}
public class FivePercentDiscount : IDiscountStrategy
{
public double CalculateDiscount(double amount) => amount * 0.05;
}
public class TenPercentDiscount : IDiscountStrategy
{
public double CalculateDiscount(double amount) => amount * 0.10;
}
// 上下文
public class DiscountContext
{
private IDiscountStrategy _strategy;
public DiscountContext(IDiscountStrategy strategy)
{
_strategy = strategy;
}
public double GetDiscount(double amount)
{
return _strategy.CalculateDiscount(amount);
}
}
// 使用示例
var context = new DiscountContext(new TenPercentDiscount());
var discount = context.GetDiscount(150); // 15
6. LINQ
用 LINQ 代替 foreach 和 if 的組合,簡(jiǎn)化集合過(guò)濾和操作。
優(yōu)點(diǎn):代碼更簡(jiǎn)潔,可讀性更高。
示例:
var numbers = new List<int> { 1, 2, 3, 4, 5, 6 };
// 使用 LINQ 過(guò)濾偶數(shù)
var evenNumbers = numbers.Where(n => n % 2 == 0).ToList();
Console.WriteLine(string.Join(", ", evenNumbers)); // 輸出: 2, 4, 6
7. 模式匹配
使用 C# 8.0 增強(qiáng)后的 switch 表達(dá)式簡(jiǎn)化多條件判斷。
優(yōu)點(diǎn):支持類型和條件模式匹配,代碼更直觀。
// (擴(kuò)展應(yīng)用)
string message = input switch {
int n when n < 0 => "負(fù)數(shù)",
int n when n == 0 => "零",
int n when n > 0 => "正數(shù)",
_ => "未知"
};
Console.WriteLine(message);
8. 委托 / Lambda 表達(dá)式
將條件邏輯封裝到委托或 Lambda 表達(dá)式中,減少重復(fù)代碼。
優(yōu)點(diǎn):邏輯復(fù)用,代碼更靈活。
// 定義一個(gè)委托 Func<int, bool> isEven = x => x % 2 == 0; // 使用委托代替條件語(yǔ)句 Console.WriteLine(isEven(4) ? "Even" : "Odd"); // 輸出: Even Console.WriteLine(isEven(3) ? "Even" : "Odd"); // 輸出: Odd
9. 提前返回
通過(guò)盡早返回結(jié)果來(lái)減少嵌套的條件判斷。
優(yōu)點(diǎn):邏輯分層清晰,減少深層嵌套。
public void ProcessOrder(Order order)
{
if (order == null) return;
if (order.Items.Count <= 0) return;
// 處理訂單邏輯
}
總結(jié)
以上就是我總結(jié)的 9 個(gè)消除或簡(jiǎn)化減少條件語(yǔ)句的方法。
根據(jù)具體的場(chǎng)景和需求選擇合適的方法,可以單獨(dú)使用,也可以組合使用,不妨在你的代碼中試試!
到此這篇關(guān)于C#條件語(yǔ)句消除或簡(jiǎn)化減少的九種方法的文章就介紹到這了,更多相關(guān)C#條件語(yǔ)句消除或減少內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
聊聊C# 中HashTable與Dictionary的區(qū)別說(shuō)明
這篇文章主要介紹了聊聊C# 中HashTable與Dictionary的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01
C#?wpf使用DockPanel實(shí)現(xiàn)制作截屏框
做桌面客戶端的時(shí)候有時(shí)需要實(shí)現(xiàn)截屏功能,能夠在界面上框選截屏,本文就來(lái)為大家介紹一下wpf如何使用DockPanel制作截屏框吧,感興趣的可以了解下2023-09-09
在C#?WPF中實(shí)現(xiàn)登錄頁(yè)面跳轉(zhuǎn)的兩種方案
在?C#?WPF?中實(shí)現(xiàn)登錄頁(yè)面跳轉(zhuǎn),核心是?“驗(yàn)證登錄邏輯”?與?“頁(yè)面切換”?結(jié)合,常用兩種方案:NavigationWindow?導(dǎo)航跳轉(zhuǎn)(適合多頁(yè)面場(chǎng)景)和Window+UserControl?切換(適合單窗口集成場(chǎng)景),本文介紹了具體實(shí)現(xiàn)步驟,需要的朋友可以參考下2025-10-10
C#中Thread.CurrentThread的用法小結(jié)
本文主要介紹了C#中Thread.CurrentThread的用法小結(jié),通過(guò)Thread.CurrentThread可以訪問(wèn)和修改當(dāng)前線程的各種屬性和方法,具有一定的參考價(jià)值,感興趣的可以了解一下2025-04-04
C#實(shí)現(xiàn)快遞api接口調(diào)用方法
這篇文章主要介紹了C#實(shí)現(xiàn)快遞api接口調(diào)用方法,主要是通過(guò)快遞API網(wǎng)接口的服務(wù),使用的時(shí)候直接申請(qǐng)個(gè)接口UID即可,有需要的小伙伴來(lái)參考下吧。2015-03-03

