14種簡化您的C#程式碼的方法 — Tim Corey影片中的C#最佳實踐資訊
在他的全面影片"簡化您的C#程式碼的14種方法"中,Tim Corey 探討了可以提高程式碼可讀性、減少混亂並保持程式碼基礎可維護的實用C#最佳實踐。 Tim集中於良好的編碼習慣,而不是對一行程式或神祕技巧的痴迷——如何編寫乾淨、易於理解的程式碼,以便其他開發者能夠跟隨。
他以Visual Studio中的真實例子為基礎構建每個技巧,並涵蓋命名慣例、錯誤處理,甚至如何重構程式碼而不破壞內容。 這不僅僅是理論——這是關於實踐使程式碼變得更好。
在這篇文章中,讓我們逐步了解他展示的14種方法。
1. 使用Static以獲得更乾淨的程式碼
Tim首先展示如何透過static存取來簡化重複調用。 通過聲明:
using static System.Console;using static System.Console;您不再需要為每個static成員加上Console前綴。
這不僅僅是去掉字詞——它關乎讓static存取物件更加清晰。 Tim指出,如果您正在調用像Console或Math這樣經常使用的類中定義的static成員,這種簡寫可以提高程式碼可讀性。
然而,作為良好編程實踐的一部分,他警告開發者應避免衝突——兩個不同的類可能具有相同名稱的static成員。 意識到潛在的意外行為是關鍵。
2. 使用List初始化
C# 現在讓您能夠更直接地初始化列表:
List<string> names = ["Tim", "Sue", "Bilbo"];List<string> names = ["Tim", "Sue", "Bilbo"];Tim解釋這不僅僅是將所有內容壓縮為一條語句——這涉及編寫更易於閱讀的程式碼,並通過減少繁文縟節來提升性能。
讀者不必解析出"new List of String"的樣板語句,可以直接看到重要的內容:集合中的描述性名稱。 Tim 也指出這對陣列甚至是字典同樣適用,與優先考慮清晰度的編碼慣例一致。
3. 目標型別的新
另一個時間節省者:目標型別的新。 代替:
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澄清其真正的力量在於匿名型別。
當與資料源(如透過Dapper的SQL)一起工作時,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. 無區域的使用語句
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 在他的影片中結束時提醒觀眾:這些簡化方法並不是要寫出晦澀的一行語句——而是關於良好的編程習慣。 像static使用、記錄、模式匹配、元組以及丟棄這樣的功能讓您可以編寫出乾淨、現代的C#。
他鼓勵開發者在採用這些特性的同時考慮命名慣例、錯誤處理和有意義的名稱。 "程式碼是給人看的,"Tim 說——當您寫出易於理解的程式碼時,您不僅改善了自己的生活,還改善了其他開發者的生活。
簡而言之:擁抱這些C#的最佳實踐,遵循單一責任原則、介面隔離原則和依賴倒置原則等SOLID原則,這樣您的程式碼不僅會編譯——它還將提高性能,減少意外行為,並保持您的團隊對編寫程式碼的熱愛。

