本文大部分整理自 MSDN,介紹 C# 3.0 為 LINQ 新增的兩大特性:分部方法與擴展方法。
分部方法讓類別的一部分定義方法簽名(類似事件),另一部分決定是否實作。若未實作,編譯器移除簽名與所有呼叫,不產生編譯或執行錯誤。適用於自動生成代碼與開發者代碼協作,無執行期開銷。
宣告組成:定義與實作,可位於不同分部類別檔案。
namespace PM {
partial class A {
partial void OnSomethingHappened(string s);
}
partial class A {
partial void OnSomethingHappened(String s) {
Console.WriteLine("Something happened: {0}", s);
}
}
}
重點規則:
partial 開頭,回傳 void。ref 參數,不可有 out 參數。private,不可為 virtual。extern。static、unsafe 修飾詞。應用場景:輕量級事件處理
自動生成代碼需通知使用者處理某操作,但不想用事件或虛方法(開銷大)。例:Customer 類別在 Name 屬性設定前後呼叫分部方法:
partial class Customer {
string name;
public string Name {
get { return name; }
set {
OnBeforeUpdateName();
OnUpdateName();
name = value;
OnAfterUpdateName();
}
}
partial void OnBeforeUpdateName();
partial void OnAfterUpdateName();
partial void OnUpdateName();
}
開發者在另一個分部類別檔實作這三個方法即可。DataContext 的 Insert/Update/Delete 也使用分部方法,後續再詳述。
擴展方法讓現有類型「新增」方法,無需建立衍生類型、重新編譯或修改原始類型。本質是特殊靜態方法,呼叫語法同實例方法。
範例:為 string 加上 WordCount
namespace ExtensionMethods {
public static class MyExtensions {
public static int WordCount(this String str) {
return str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries).Length;
}
}
}
第一個參數前加 this 告訴編譯器擴展目標類型。使用時:
using ExtensionMethods;
string s = "Hello Extension Methods";
int i = s.WordCount();
重點:
通用準則:
using 引入)。