首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 獨有特性:自動屬性、集合初始化器、多行 Lambda 等

     編輯:關於C#

.NET 3.5 / C# 3.0 引入多項 VB 不支援的語法特性,大幅提升開發效率與程式碼表達力。本文詳細介紹自動屬性、集合初始化器、物件初始化器、多行 Lambda、匿名型別等 C# 獨有功能。

1. 自動屬性

編譯器自動產生背景欄位,減少樣板程式碼。

// 基本形式
public int Id { get; set; }

// 存取層級差異
public string Name { get; private set; }  // 唯讀對外
public DateTime CreatedAt { get; init; }  // C# 9.0:僅初始化可設定

// C# 6.0+:自動屬性初始化
public int MaxRetryCount { get; set; } = 3;

// C# 7.0+:唯讀自動屬性(建構函數指派)
public Guid CorrelationId { get; } = Guid.NewGuid();

優勢

  • 資料繫結(WinForms/WPF/ASP.NET)僅支援屬性,不支援欄位
  • 未來可無縫加入驗證邏輯而不破壞介面
  • 序列化/ORMaping 工具通常要求屬性
  • 偵錯時可在 setter 設中斷點

2. 集合初始化器

任何實作 IEnumerable 且有 Add 方法的型別均可使用。

// List
var names = new List { "Alice", "Bob", "Charlie" };

// Dictionary
var scores = new Dictionary
{
    ["Alice"] = 95,
    ["Bob"] = 87,
    ["Charlie"] = 92
};

// HashSet
var uniqueTags = new HashSet { "csharp", "dotnet", "linq" };

// 自訂類別(需實作 IEnumerable 並有 Add 方法)
public class MyCollection : IEnumerable
{
    private List _items = new();
    public void Add(string item) => _items.Add(item);
    public IEnumerator GetEnumerator() => _items.GetEnumerator();
    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}

// 使用
var custom = new MyCollection { "A", "B", "C" };

3. 物件初始化器

var person = new Person
{
    Name = "Alice",
    Age = 28,
    Address = new Address { City = "Taipei", Zip = "100" },
    Skills = new List { "C#", "SQL" }
};

// 等同於:
// var person = new Person();
// person.Name = "Alice";
// person.Age = 28;
// ...

4. 多行 Lambda 運算式

VB 僅支援單行 Lambda,C# 完整支援陳述式區塊。

// 多行 Lambda(需大括號與 return)
Func calculate = (x, y) =>
{
    var sum = x + y;
    var product = x * y;
    Console.WriteLine($"Sum: {sum}, Product: {product}");
    return sum + product;
};

// 事件處理
button.Click += (sender, e) =>
{
    Log.Info("Button clicked");
    UpdateUI();
    await SaveAsync();
};

// LINQ 中使用
var result = items.Where(item =>
{
    if (!item.IsValid) return false;
    var score = CalculateScore(item);
    return score > Threshold;
});

5. 匿名型別

var product = new { Id = 1, Name = "Laptop", Price = 29999 };
Console.WriteLine(product.Name); // 唯讀屬性

// LINQ 投影常用
var summary = orders.Select(o => new 
{ 
    o.OrderId, 
    CustomerName = o.Customer.Name, 
    Total = o.Items.Sum(i => i.Price * i.Quantity) 
});

6. 擴充方法

public static class StringExtensions
{
    public static bool IsNullOrWhiteSpace(this string str)
        => string.IsNullOrWhiteSpace(str);

    public static string ToTitleCase(this string str)
        => CultureInfo.CurrentCulture.TextInfo.ToTitleCase(str.ToLower());
}

// 使用
"  hello world  ".IsNullOrWhiteSpace(); // false
"hello world".ToTitleCase(); // "Hello World"

7. 運算式主體成員

public class Calculator
{
    // 方法
    public int Add(int a, int b) => a + b;
    
    // 屬性
    public double Pi => Math.PI;
    
    // 建構函數 (C# 7.0+)
    public Calculator(int initialValue) => _value = initialValue;
    
    // 解構函式 (C# 7.0+)
    public void Deconstruct(out int x, out int y) => (x, y) = (_value, _value * 2);
}

C# vs VB.NET 特性對照

| 特性 | C# | VB.NET (同期版本) | |------|-----|-------------------| | 自動屬性 | ✅ 完整支援 | ✅ 支援 | | 集合初始化器 | ✅ 完整支援 | ❌ 不支援 | | 多行 Lambda | ✅ 完整支援 | ❌ 僅單行 | | 匿名型別 | ✅ 完整支援 | ✅ 支援 (不同語法) | | 擴充方法 | ✅ 完整支援 | ✅ 支援 (Module+Extension) | | 運算式主體 | ✅ 完整支援 | ❌ 不支援 | | 模式比對 | ✅ 完整支援 (C# 7+) | ⚠️ 部分支援 | | 記錄型別 | ✅ C# 9+ | ❌ 不支援 |

總結

這些 C# 獨有特性不只是語法糖,更能:

  • 減少 30-50% 的樣板程式碼
  • 提升程式碼可讀性與表達力
  • 啟用函數式程式設計模式
  • 與現代框架(EF Core、ASP.NET Core、MAUI)完美整合

建議團隊制定編碼規範,全面採用這些現代 C# 特性,淘汰舊式冗長寫法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved