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

C# 3.0 擴充方法擴充介面的實戰技巧

     編輯:關於C#

為何要擴充介面?

介面一旦發布即難以修改 (破壞現有實作)。擴充方法允許在不修改介面定義、不修改實作類別的情況下,為介面「新增」方法,解決版本演進難題。

實作範例

// 定義介面
public interface ILogger
{
    void Log(string message);
}

// 擴充方法類別 (必須為 static)
public static class LoggerExtensions
{
    // this ILogger 表示擴充 ILogger
    public static void LogError(this ILogger logger, string error)
    {
        logger.Log($"[ERROR] {error}");
    }

    public static void LogWarning(this ILogger logger, string warning)
    {
        logger.Log($"[WARN] {warning}");
    }
}

// 使用
public class ConsoleLogger : ILogger
{
    public void Log(string msg) => Console.WriteLine(msg);
}

var logger = new ConsoleLogger();
logger.LogError("磁碟空間不足");     // 輸出: [ERROR] 磁碟空間不足
logger.LogWarning("記憶體使用率 90%"); // 輸出: [WARN] 記憶體使用率 90%

三大優勢

  1. 零修改現有程式碼:實作類別完全不用動,若實作類別分散於多個組件/第三方庫,極具價值。
  2. 命名空間自動啟用:將擴充方法置於介面相同命名空間,使用者 using 介面即自動啟用擴充方法,無額外引用負擔。
  3. 多態行為可控:介面呼叫走擴充方法,具體類別呼叫走自身實作 (若同名),透過轉型控制行為。

名稱衝突處理:介面 vs 類別實作

public interface ITest { void Do(); }

public static class Ext { public static void Do(this ITest t) => Console.WriteLine("Ext"); }

public class Impl : ITest
{
    public void Do() => Console.WriteLine("Impl");
    public void DoExt() => Console.WriteLine("Impl.DoExt");
}

// 測試
ITest i = new Impl();
i.Do();           // 輸出: Ext (介面呼叫 → 擴充方法)
((Impl)i).Do();   // 輸出: Impl (類別呼叫 → 實例方法)
i.DoExt();        // 編譯錯誤:ITest 無 DoExt
((Impl)i).DoExt(); // 輸出: Impl.DoExt

規則:實例方法優先於擴充方法。介面型別呼叫解析到擴充方法;具體型別呼叫解析到實例方法。

適用場景

  • 為 .NET 標準介面 (IEnumerable<T>, IQueryable<T>) 新增輔助方法 (LINQ 即大量使用此模式)
  • 第三方庫介面無法修改但需新增功能
  • 跨組件共用介面擴充邏輯,避免重複實作
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved