iT邦幫忙

2025 iThome 鐵人賽

DAY 30
0
Software Development

新 .NET & Azure & IoT & AI 開源技術實戰手冊 (含深入官方程式碼講解) 系列 第 30

C# 12/13 新語言特性(必要成員、原始字串)

  • 分享至 

  • xImage
  •  

C# 12/13 新語言特性(必要成員、原始字串)

版本情況

  • C# 11(回顧):required 成員、原始字串(raw string)、list patterns…(本文聚焦兩項)

  • C# 12:主建構式、集合運算式、lambda 預設參數、using 可別名任意型別

  • C# 13(.NET 9):params 可用集合運算式、ref readonly 參數 等

  • 提示:若使用預覽功能,於 .csproj 設定 preview

  • required 成員(C# 11)

    • 重點:型別的必要成員必須在建構完成前被指定
    • 範例
      public class User
      {
              public required int Id { get; init; }
              public required string Name { get; init; }
      }
      
      var u = new User { Id = 1, Name = "Alice" }; // OK
      // var bad = new User { Id = 1 };            // 編譯錯誤:Name 未指定
      
    • 進階:在自訂建構式中指定必要成員可加 [SetsRequiredMembers]
  • 原始字串 Raw string(C# 11)

    • 多行、不需跳脫、易於內嵌 JSON/SQL;搭配 $ 與多個 $ 支援插值
    • 範例
      var json = """
      {
          "id": 1,
          "name": "Alice\nBob"
      }
      """;
      
      var name = "Alice";
      var s = $"""
      Hello, {name}
      Path: C:\temp\file.txt
      """;
      
      var col = "color";
      var css = $$"""
      .btn { {{col}}: red; }  // 使用 $$ 與 {{ }} 插入大括號
      """;
      
  • 主建構式 Primary constructors(C# 12)

    • 類別/結構可直接於型別宣告列出參數,供欄位/屬性初始化
    • 範例
      public class Person(string name, int age)
      {
              public string Name { get; } = name;
              public int Age { get; } = age;
      }
      
  • 集合運算式 Collection expressions(C# 12)

    • 用 [] 建立/合併集合,支援展開(..)與多型轉換(陣列、List、Span 等)
    • 範例
      int[] a = [1, 2, 3];
      List<int> b = [..a, 4, 5];
      ReadOnlySpan<int> s = [10, 20];
      
  • Lambda 預設參數(C# 12)

    • 範例
      var f = (int x = 42) => x * 2;
      var r1 = f();    // 84
      var r2 = f(5);   // 10
      
  • using 可別名任意型別(C# 12)

    • 現在可為 tuple/ref struct/指標 等取別名
    • 範例
      using Pair = (int X, int Y);
      Pair p = (1, 2);
      
  • params 搭配集合運算式(C# 13)

    • 可直接以集合運算式當作 params 引數;也改善與各種集合型別的搭配
    • 範例
      void Print(params int[] xs) { /* ... */ }
      
      Print([1, 2, 3]);          // 直接使用集合運算式
      Print([..Enumerable.Range(1, 3)]);
      
  • ref readonly 參數(C# 13)

    • 明確以唯讀參考傳遞(語義上等同 in,但在多載解決上更清晰)
    • 範例
      static int Len(ref readonly ReadOnlySpan<char> s) => s.Length;
      
      var name = "Alice";
      var span = name.AsSpan();
      var n = Len(in span); // 呼叫端以 in 傳入
      ```## C# 12/13 新語言特性  
      
      

版本說明

  • C# 11 回顧:必要成員、原始字串、list patterns 等(本文聚焦必要成員與原始字串)
  • C# 12:主建構式、集合運算式、Lambda 預設參數、using 可別名任意型別
  • C# 13 .NET 9:params 搭配集合運算式、ref readonly 參數等
  • 提示:若使用預覽功能,於 .csproj 設定 <LangVersion>preview</LangVersion>

必要成員(C# 11)

  • 重點:型別的必要成員須於建構完成前指定
  • 範例
    public class User  
    {  
        public required int Id { get; init; }  
        public required string Name { get; init; }  
    }  
    
    var u = new User { Id = 1, Name = "Alice" }; // 成功  
    // var bad = new User { Id = 1 };            // 編譯錯誤:Name 未指定  
    
  • 進階:自訂建構式指定必要成員時可加 [SetsRequiredMembers]

原始字串(C# 11)

  • 多行內容無需跳脫字元,適用內嵌 JSON/SQL;搭配 $ 支援插值
  • 範例
    var json = """  
    {  
        "id": 1,  
        "name": "Alice\nBob"  
    }  
    """;  
    
    var name = "Alice";  
    var s = $"""  
    Hello, {name}  
    Path: C:\temp\file.txt  
    """;  
    
    var col = "color";  
    var css = $$"""  
    .btn { {{col}}: red; }  
    """;  
    

主建構式(C# 12)

  • 類別或結構可於宣告直接列出參數,供欄位初始化
  • 範例
    public class Person(string name, int age)  
    {  
        public string Name { get; } = name;  
        public int Age { get; } = age;  
    }  
    

集合運算式(C# 12)

  • [] 建立或合併集合,支援展開(..)與多型轉換
  • 範例
    int[] a = [1, 2, 3];  
    List<int> b = [..a, 4, 5];  
    ReadOnlySpan<int> s = [10, 20];  
    

Lambda 預設參數(C# 12)

  • 範例
    var f = (int x = 42) => x * 2;  
    var r1 = f();    // 84  
    var r2 = f(5);   // 10  
    

using 可別名任意型別(C# 12)

  • 可為 tuple、ref struct 或指標取別名
  • 範例
    using Pair = (int X, int Y);  
    Pair p = (1, 2);  
    

params 搭配集合運算式(C# 13)

  • 可直接傳入集合運算式作為 params 引數
  • 範例
    void Print(params int[] xs) { /* ... */ }  
    
    Print([1, 2, 3]);  
    Print([..Enumerable.Range(1, 3)]);  
    

ref readonly 參數(C# 13)

  • 以唯讀參考傳遞參數,語義清晰且支援多載
  • 範例
    static int Len(ref readonly ReadOnlySpan<char> s) => s.Length;  
    
    var name = "Alice";  
    var span = name.AsSpan();  
    var n = Len(in span);  
    

簡單小結
C# 12與13持續強化開發效率與程式碼清晰度。必要成員有效避免未初始化錯誤,確保物件狀態完整性;原始字串大幅簡化多行字串處理,尤其適用JSON或SQL內嵌場景。主建構式減少類別宣告樣板程式碼,集合運算式提供直觀的集合操作方式,支援展開與型別轉換。Lambda預設參數提升匿名函式彈性,using別名擴展至複雜型別。C# 13新增的params集合運算式整合與ref readonly參數,進一步優化參數傳遞語義。這些特性共同提升可讀性與維護性,建議在新專案中優先採用必要成員與原始字串,逐步引入其他功能。使用預覽功能時需明確設定語言版本,並注意相容性。整體而言,新特性聚焦開發者體驗,降低常見錯誤風險,同時保持語言輕量與高效。


上一篇
Middleware 執行鏈與 DI 生命週期
系列文
新 .NET & Azure & IoT & AI 開源技術實戰手冊 (含深入官方程式碼講解) 30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言