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

































