版本情況
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 未指定
原始字串 Raw string(C# 11)
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)
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)
using Pair = (int X, int Y);
Pair p = (1, 2);
params 搭配集合運算式(C# 13)
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); // 呼叫端以 in 傳入
```## C# 12/13 新語言特性
<LangVersion>preview</LangVersion>
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]
$
支援插值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; }
""";
public class Person(string name, int age)
{
public string Name { get; } = name;
public int Age { get; } = age;
}
[]
建立或合併集合,支援展開(..
)與多型轉換int[] a = [1, 2, 3];
List<int> b = [..a, 4, 5];
ReadOnlySpan<int> s = [10, 20];
var f = (int x = 42) => x * 2;
var r1 = f(); // 84
var r2 = f(5); // 10
using Pair = (int X, int Y);
Pair p = (1, 2);
void Print(params int[] xs) { /* ... */ }
Print([1, 2, 3]);
Print([..Enumerable.Range(1, 3)]);
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參數,進一步優化參數傳遞語義。這些特性共同提升可讀性與維護性,建議在新專案中優先採用必要成員與原始字串,逐步引入其他功能。使用預覽功能時需明確設定語言版本,並注意相容性。整體而言,新特性聚焦開發者體驗,降低常見錯誤風險,同時保持語言輕量與高效。