14 種簡化 C# 代碼的方法—來自 Tim Corey 視頻的 C# 最佳實踐見解
在他全面的影片"簡化C#程式碼的14種方法"中,Tim Corey 探討了實用的 C# 最佳實踐,這些實踐可以提高代碼可讀性、減少雜亂並保持您的代碼庫可維護。 Tim專注於良好的編碼實踐,而不是痴迷於單行或晦澀的技巧——如何編寫其他開發者可以遵循的乾淨、可理解的代碼。
他圍繞 Visual Studio 中的實際示例來框定每個提示,涉及命名約定、錯誤處理,甚至如何在不破壞事物的情況下重構代碼。 這不僅僅是理論——這是關於實踐讓代碼更好。
在這篇文章中,讓我們一步步回顧他展示的14種方法。
1. 使用靜態來簡化代碼
Tim首先展示了如何通過靜態訪問來簡化重複調用。 使用聲明:
using static System.Console;
using static System.Console;
您不再需要在每個靜態成員前加上 Console。
這不僅僅是去掉詞語——而是在於使得靜態訪問清晰。 Tim指出,如果您正在調用一個常用類比如 Console 或 Math 的靜態成員,這種簡寫可以改善代碼的可讀性。
然而,作為良好的編碼習慣的一部分,他警告開發人員要避免衝突——可能有兩個不同的類擁有相同名稱的靜態成員。 對潛在意外行為的意識是關鍵。
2. 使用初始化列表
C# 現在讓您可以更直接地初始化列表:
List<string> names = ["Tim", "Sue", "Bilbo"];
List<string> names = ["Tim", "Sue", "Bilbo"];
Tim解釋這並不是要把一切都壓縮成一個語句——而是要編寫更易讀的代碼,通過減少繁瑣提高性能。
與其分析出"新的字符串列表"樣板,讀者可以直接看到重要的:集合中的描述性名稱。 Tim還指出,這也適用於數組甚至字典,符合強調清晰度的編碼約定。
3. 目標類型化的new
另一個省時的方法:目標類型化的 new。 與其:
List<int> numbers = new List<int>();
List<int> numbers = new List<int>();
您可以寫:
List<int> numbers = new();
List<int> numbers = new();
Tim強調重複類名稱是沒有必要的——它已經在左邊。這遵循了良好的編碼實踐,通過消除冗餘使代碼庫更易於掃描。
4. var 和匿名類型
Tim探討了 var,一個在編碼練習圈中引發爭論的功能。 有些人不喜歡它隱藏變量名稱和類型,但Tim澄清它真正的力量在於匿名類型。
當與數據源(如 SQL 通過 Dapper)一起工作時,Tim展示了 var 如何讓您隨時創建對象:
var parameters = new { FirstName = "Tim", LastName = "Corey" };
var parameters = new { FirstName = "Tim", LastName = "Corey" };
這是寫查詢或一次性對象的理想選擇——您不需要僅僅為參數創建一個基類。 正如Tim所說,這避免了不必要的類型污染您的代碼庫,同時仍能在出現問題時提供有意義的錯誤信息。
5. 文件範圍命名空間
Tim移到文件範圍命名空間,展示了如何從這樣:
namespace ProjectName
{
// indented code
}
namespace ProjectName
{
// indented code
}
變成這樣:
namespace ProjectName;
namespace ProjectName;
這個小改動消除了浪費的縮排,並遵循 C# 命名約定,如公共成員的 Pascal 命名法。 Tim解釋,因為大多數文件只包含一個命名空間,這提高了代碼可讀性,並保持邏輯部分對齊。
6. 用記錄定義單行數據結構
使用記錄讓您可以在一個語句中定義數據對象:
public record EmployeeRecord(int Id, string Name);
public record EmployeeRecord(int Id, string Name);
Tim指出這會自動生成完整的類型——屬性、不變性和 ToString()——並帶來極小的努力。 他明確指出派生類場景仍然需要類,但當您的對象是只讀時,記錄會按照單一責任原則做到一件事做好。
7. 模式匹配
Tim展示了如何使用模式匹配幫助您安全地處理異常和執行比較。 與其寫冗長的類型檢查,您可以這樣組合它們:
if (emp is EmployeeRecord e)
{
e.Id = 1;
}
if (emp is EmployeeRecord e)
{
e.Id = 1;
}
這一行就能檢查和轉換。 Tim說這符合好的編碼實踐—您避免單字母變量名如x或y,而是給予有描述性的名字如e。 清晰的方法名稱和變量名稱使得其他開發人員更易於維護代碼。
8. 字符串插值
為構建可讀的字符串,Tim展示了字符串插值:
$"The employee with ID {e.Id} is {e.Name}"
$"The employee with ID {e.Id} is {e.Name}"
他指出這使得有意義的錯誤信息和寫註釋更容易。 與其糾結於拼接,你可以直接寫代碼,讀起來像英文—提高代碼質量並簡化未來檢查輸出的單元測試。
9. 使用 nameof() 進行安全重構
Tim展示了如何在重構代碼時使用 nameof() 保護自己。 字符串中的硬編碼變量名如被重命名可能導致意外行為。 但通過這樣寫:
nameof(emp)
nameof(emp)
編譯器會自動更新每個用法。 這是保持代碼庫健康的最佳實踐之一,當您編寫乾淨並重組代碼時。
10. 使用元組返回多個值
Tim使用元組來避免僅僅為了返回兩個值而創建基類:
(string FirstName, string LastName) SplitName(string fullName)
(string FirstName, string LastName) SplitName(string fullName)
這避免了不必要的外部依賴,並遵循單一責任原則——方法僅分割一個名字,不多於此。 正如Tim所說,避免過度設計的實踐讓代碼更好。
11. 解構
基於元組,Tim展示了如何將結果解構到本地變數中:
var (firstName, lastName) = SplitName("Tim Corey");
var (firstName, lastName) = SplitName("Tim Corey");
這保持變量名稱描述性並避免後來的晦澀元組語法。 Tim甚至提到丟棄未使用的值(使用 _),這表示意圖—沒有未解釋的單字母變量名留下。
12. 為不需要的值進行丟棄
如果您不需要所有的元組部分,Tim建議丟棄:
var (firstName, _) = SplitName("Tim Corey");
var (firstName, _) = SplitName("Tim Corey");
這告訴其他開發者您是有意忽略某個值—這對測試框架或單元測試很有用,那裡並不是所有輸出都重要。
13. 不含塊的 using 語句
Tim進入資源管理和錯誤處理。 以前,您可能會這樣寫:
using (var connection = new SqlConnection(connString))
{
// work
}
using (var connection = new SqlConnection(connString))
{
// work
}
現在,您可以這樣使用:
using var connection = new SqlConnection(connString);
using var connection = new SqlConnection(connString);
這符合SOLID原則——特別是單一責任原則和依賴反轉原則。 Tim指出這種語法適用於像數據庫這樣的外部依賴,確保大多數異常處理更清晰和連接始終關閉,避免性能問題甚至SQL注入場景,當連接沒有被釋放時。
14. 內聯out變量聲明
最後,Tim介紹了內聯out變量聲明用於解析:
if (int.TryParse(numberText, out int numberValue))
if (int.TryParse(numberText, out int numberValue))
在這裡,您在同一行創建局部變量。這使編碼約定緊密和方法名稱描述性。通過正確分組代碼,您減少了意外行為並使未來的重構代碼工作更安全。
總結
Tim在他影片的結尾提醒觀眾:這些簡化不是在於寫晦澀的單行—而是關於良好的編碼慣例。 使用靜態、記錄、模式匹配、元組和丟棄等功能讓您寫出乾淨、現代的 C#。
他鼓勵開發者在採用這些功能時思考命名約定、錯誤處理和有意義的名字。 "代碼是為人類閱讀而設計的,"Tim說—當您編寫容易理解的代碼時,您為自己和其他開發者改善了生活。
簡而言之:採用這些 C# 最佳實踐,遵循SOLID原則如單一責任原則、介面隔離原則和依賴反轉原則,您的代碼不僅能編譯—它將提升性能、減少意外行為並保持您的團隊快樂地編寫代碼。
