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

LINQ to SQL 深入學習系列(二):C# 3.0 為 LINQ 的增強之二——分部方法與擴展方法

     編輯:關於.NET

本文大部分整理自 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);
        }
    }
}

重點規則:

  1. 必須以 partial 開頭,回傳 void。
  2. 可有 ref 參數,不可有 out 參數。
  3. 隱含 private,不可為 virtual。
  4. 不可為 extern。
  5. 可有 static、unsafe 修飾詞。
  6. 可為泛型,約束放在定義端。
  7. 不可轉換為委派。

應用場景:輕量級事件處理
自動生成代碼需通知使用者處理某操作,但不想用事件或虛方法(開銷大)。例: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();

重點:

  1. 本質是編譯期將實例呼叫轉為靜態方法呼叫,不違反封裝,無法存取私有成員。
  2. 通常呼叫而非自行實作;需引用定義擴展方法的命名空間。
  3. 優先順序:實例方法 > 最近命名空間靜態方法 > 較遠命名空間靜態方法。同名簽名擴展方法永不被呼叫。

通用準則:

  1. 只在不得已時實作,優先考慮繼承。
  2. 擴展無法修改原始碼的類型時,承擔原類型變更導致失效風險。
  3. 若實作,注意:同簽名實例方法優先;擴展方法在命名空間層級引入(同一命名空間下多個靜態類的擴展方法會被同一 using 引入)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved