告別過(guò)時(shí)寫法!五個(gè)現(xiàn)代C#技巧讓你的代碼更簡(jiǎn)潔、更安全
C#已經(jīng)存在了二十多年,每個(gè)新版本都會(huì)悄悄加入一些特性,讓日常編碼更簡(jiǎn)潔、更安全、更優(yōu)雅。問(wèn)題是大多數(shù)開(kāi)發(fā)者還停留在五年前學(xué)到的編碼方式中。
他們還在不停地輸入 using (...) {},用命名空間的大括號(hào)堆砌文件,或者忘記空安全性和必需屬性存在的意義。
本文討論了5個(gè)現(xiàn)代C#技巧,可以減少代碼冗余,讓你的意圖更加清晰。這些技巧并不復(fù)雜,也不小眾,而是那種能夠逐漸累積形成更清晰、更易維護(hù)代碼的習(xí)慣。
1. 在is模式中使用解構(gòu)
C#中的模式匹配已經(jīng)發(fā)展成為該語(yǔ)言最具表現(xiàn)力的特性之一。一個(gè)很好的例子就是在is模式中使用解構(gòu)。你無(wú)需先檢查類型再賦值,而是可以在單個(gè)語(yǔ)句中獲取所有需要的信息。
舊寫法:
if (person is Employee e)
{
var id = e.Id;
var department = e.Department;
Console.WriteLine($"{id} - {department}");
}這樣寫雖然可行,但感覺(jué)有些冗余。
更好的寫法:
if (person is Employee(var id, var department))
{
Console.WriteLine($"{id} - {department}");
}只要你的類型有解構(gòu)器(比如記錄類型就有),這種方法就能減少重復(fù),讓條件判斷一目了然。你無(wú)需分兩步操作,直接在if語(yǔ)句中聲明你的意圖。
2. 使用文件作用域命名空間簡(jiǎn)化代碼文件
多年來(lái),每個(gè)C#文件都以namespace MyApp { ... }開(kāi)頭,這迫使你進(jìn)入不必要的縮進(jìn)層級(jí)。一旦你的類變得龐大,屏幕的一半空間都會(huì)被用來(lái)維護(hù)大括號(hào)。
舊風(fēng)格:
namespace MyApp.Core
{
public class UserService
{
// 所有內(nèi)容都需要縮進(jìn)
}
}文件作用域命名空間風(fēng)格:
namespace MyApp.Core;
public class UserService
{
// 簡(jiǎn)潔平整
}這可能看起來(lái)是小事,但一旦你在整個(gè)代碼庫(kù)中應(yīng)用它,每個(gè)文件都會(huì)立刻感覺(jué)更輕量。減少一層視覺(jué)噪音讓你更容易專注于重要的事情:你的實(shí)際代碼。
3. 在對(duì)象初始化器中優(yōu)先使用必需屬性以確保安全
你見(jiàn)過(guò)多少次User對(duì)象在你的系統(tǒng)中游蕩,卻缺少電子郵件、ID或其他絕對(duì)不應(yīng)為空的屬性?這正是required關(guān)鍵字大放異彩的地方。
沒(méi)有required的情況:
public class User
{
public string Name { get; set; }
public string Email { get; set; }
}
// 這能編譯但是不完整
var user = new User { Name = "Alice" };這能編譯通過(guò),但現(xiàn)在你有一個(gè)缺少電子郵件的User對(duì)象。這是一個(gè)潛在的bug。
使用required的情況:
public class User
{
public required string Name { get; init; }
public required string Email { get; init; }
}
var user = new User { Name = "Alice", Email = "alice@mail.com" };編譯器會(huì)強(qiáng)制要求設(shè)置Name和Email屬性。沒(méi)有捷徑可走,不會(huì)忘記賦值。這就像在你的類型系統(tǒng)中內(nèi)置了一個(gè)安全網(wǎng),對(duì)于領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)特別有益,因?yàn)椴煌暾膶?duì)象可能會(huì)破壞業(yè)務(wù)規(guī)則。
4. 使用聲明式using var替代嵌套塊
舊的using語(yǔ)句迫使你使用塊作用域,這很快會(huì)變成令人畏懼的"金字塔厄運(yùn)"。
舊風(fēng)格:
using (var stream = new FileStream("file.txt", FileMode.Open))
{
using (var reader = new StreamReader(stream))
{
Console.WriteLine(reader.ReadToEnd());
}
}現(xiàn)代風(fēng)格:
using var stream = new FileStream("file.txt", FileMode.Open);
using var reader = new StreamReader(stream);
Console.WriteLine(reader.ReadToEnd());資源仍然會(huì)自動(dòng)釋放,但你避免了混亂的嵌套。代碼保持線性,這意味著更易于閱讀和調(diào)試。
5. 在switch表達(dá)式中優(yōu)先使用棄元_避免冗余的default
Switch表達(dá)式讓條件邏輯簡(jiǎn)潔明了,但許多開(kāi)發(fā)者仍然用不必要的default關(guān)鍵字來(lái)堆砌它們。
冗長(zhǎng)寫法:
var result = status switch
{
200 => "OK",
404 => "Not Found",
default => "Unknown"
};使用棄元更簡(jiǎn)潔:
var result = status switch
{
200 => "OK",
404 => "Not Found",
_ => "Unknown"
};使用_清楚地表明你在處理"其他所有情況"。這不是你忘記考慮的兜底方案,而是一個(gè)有意識(shí)的回退處理。
你編寫C#的時(shí)間越長(zhǎng),就越會(huì)意識(shí)到是那些小習(xí)慣造成了最大的不同。用文件作用域命名空間減少多余的大括號(hào),用必需屬性強(qiáng)制創(chuàng)建有效對(duì)象,或者用using var扁平化代碼——這些可能看起來(lái)不炫酷,但隨著時(shí)間的推移,它們會(huì)累積成更容易信任、更容易閱讀的代碼。
關(guān)鍵在于保持對(duì)語(yǔ)言發(fā)展的關(guān)注。這些特性大多已經(jīng)存在多年,但許多代碼庫(kù)仍然停留在2010年代的模式中。你越早開(kāi)始采用這些現(xiàn)代實(shí)踐,你的代碼庫(kù)就能越早停止與你對(duì)抗,開(kāi)始與你協(xié)作。

































