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

.NET 3.5/C# 3.0 新特性全景回顧:自動屬性、var、匿名類型、Lambda、擴展方法

     編輯:關於C#

語言版本與運行時關係

C# 3.0 / .NET 3.5 運行在 CLR 2.0 上。所有新特性均為**編譯器語法糖**,IL 層面無變化。`clrver` 仍顯示 2.0.xxx。

1. 自動屬性

public class User
{
    public int Id { get; set; }           // 讀寫
    public string Name { get; private set; } // 唯讀 (外部不可設)
    // public string Email { private get; set; } // 唯寫 (罕用)
}

IL 真相

  • 編譯器自動生成隱私字段 `k__BackingField` (非合法 C# 標識符,但合法 IL)
  • 生成 `get_Id()` / `set_Id()` 方法,訪問性與屬性一致
  • 無法在代碼中顯式調用這些方法 (編譯錯誤)
  • 若手寫同名方法會衝突:`Type already reserves a member called 'get_Id'`

限制

  • 無法在屬性內加邏輯 (驗證、通知、延遲加載)
  • 無法指定初始值 (C# 6.0 才支援 `= 初始值`)
  • `internal`/`protected` 組合有交集限制

2. 隱含類型區域變量 (var)

var numbers = new int[10];        // int[]
var name = "Hello";               // string
var dict = new Dictionary<int,string>(); // Dictionary<int,string>
// var x; // 錯誤:必須初始化
// var y = null; // 錯誤:無法推斷類型

關鍵點

  • **編譯期確定類型**,非動態類型 (dynamic 是 C# 4.0)
  • 僅限區域變量,不可用於字段、參數、返回類型
  • 配合匿名類型、LINQ 查詢結果極其方便

3. 對象/集合初始化器

// 對象初始化器
var user = new User { Id = 1, Name = "Tom" }; // 呼叫無參構造 + 屬性 set
var user2 = new User(1) { Name = "Tom" };     // 呼叫帶參構造 + 屬性 set

// 集合初始化器
var list = new List<User> {
    new User { Id = 1, Name = "A" },
    new User { Id = 2, Name = "B" }
};
// IL: 編譯器生成臨時變量依次 Add

4. 匿名類型

var p = new { Name = "Tom", Age = 25 };
// 類型名: <>f__AnonymousType0`2[System.String,System.Int32]
// 屬性唯讀,初始化後不可改
// p.Name = "Jerry"; // 編譯錯誤: read only

特性

  • 類型不可見 (需反射或泛型傳遞)
  • 同屬性名/順序/類型 → 同一匿名類型 (同程序集內)
  • 順序不同 → 不同類型 (`new {A=1,B=2}` vs `new {B=2,A=1}`)
  • 結構相等:同屬性值 → Equals 為 true、GetHashCode 相同

跨方法返回技巧

public static T Create<T>(Func<T> factory) => factory();

var anon = Create(() => new { Name = "Tom", Age = 25 }); // 型別推斷成功

5. Lambda 表達式

匿名方法升級版,語法:`(參數) => {體}` 或 `(參數) => 表達式`

Func<string> f1 = () => "abc";
Func<int,int,int> add = (x, y) => x + y;
Action<string> log = msg => Console.WriteLine(msg);
Predicate<int> isEven = n => n % 2 == 0;

系統預定義委托

委托簽名用途
Func<TResult>() => TResult無參有返回
Func<T, TResult>(T) => TResult一參有返回
Action<T>(T) => void一參無返回
Predicate<T>(T) => bool條件判斷

IL 生成

編譯器生成私有靜態方法 `

b__0`,標記 `CompilerGeneratedAttribute`。

6. 擴展方法

public static class StringExtensions
{
    public static string AddPrefix(this string s, string prefix) 
        => prefix + s;
}

// 使用
"hello".AddPrefix(">>> "); // ">>> hello"

規則

  • 靜態類 + 靜態方法
  • 第一參數加 `this` 修飾符,表示擴展類型
  • 同簽名實例方法優先於擴展方法
  • 無法訪問私有/受保護成員
  • 可擴展介面 (如 `IEnumerable<T>` 豐富 LINQ)

特性對照總結

特性關鍵字核心優勢注意點
自動屬性get/set減少樣板代碼無邏輯、無初始值
varvar簡化複雜泛型聲明僅區域變量、必須初始化
初始化器{ }聲明式構建對象圖需無參構造
匿名類型new { }臨時數據傳遞唯讀、不可跨方法強類型
Lambda=>函數式編程基石閉包捕獲變量生命週期
擴展方法this不修改源碼擴展行為實例方法優先、無狀態

這六大特性奠定了現代 C# 風格,也是 LINQ、EF、ASP.NET Core 等框架的語言基石。

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