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

C# 擴充方法深度解析:語法、IntelliSense 與實戰模式

     編輯:關於C#

什麼是擴充方法?

擴充方法讓你在不修改原型別、不繼承的前提下,為現有型別「新增」實例方法。語法要求:

  • 定義於 static 類別中
  • 方法本身為 static
  • 第一個參數加上 this 修飾詞,指定被擴充的型別

基本語法與 IntelliSense 效果

public static class DataReaderExtensions
{
    public static string GetString(this IDataReader dr, string columnName)
        => dr.GetString(dr.GetOrdinal(columnName));

    public static int GetInt32(this IDataReader dr, string columnName)
        => dr.GetInt32(dr.GetOrdinal(columnName));
}

使用時:

using MyExtensions; // 必須引入命名空間

var name = reader.GetString("UserName"); // IntelliSense 顯示為擴充方法(藍色下箭頭圖示)
var age = reader.GetInt32("Age");

Visual Studio 會在成員清單中以特殊圖示標示擴充方法,並自動帶入 this 參數。

進階模式:擴充介面與多型行為

擴充 IDataReader 介面,所有實作類別(SqlDataReader、OracleDataReader 等)自動獲得擴充方法:

public static T GetValue(this IDataReader dr, string name)
{
    var ordinal = dr.GetOrdinal(name);
    return (T)dr.GetValue(ordinal);
}

// 使用
var id = reader.GetValue("Id");
var email = reader.GetValue("Email");

擴充 Object:全域可用的工具方法

public static class ObjectExtensions
{
    public static bool IsIn(this object item, IEnumerable collection)
    {
        foreach (var elem in collection)
            if (Equals(item, elem)) return true;
        return false;
    }

    public static bool IsEmail(this string text)
        => Regex.IsMatch(text, @"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");
}

所有型別(含實值型別經裝箱)皆可呼叫:


if (userInput.IsEmail()) { ... }
if (selectedItem.IsIn(validOptions)) { ... }

命名空間與可見性控制

  • 擴充方法只在 using 其命名空間時可見,避免污染全域 IntelliSense
  • 建議將擴充方法集中放在 *.Extensions 命名空間
  • 同簽章的實例方法優先於擴充方法(編譯器解析規則)

LINQ 的基石

LINQ 標準查詢運算子(Where、Select、GroupBy...)本質都是擴充 IEnumerable<T> 的靜態方法。理解擴充方法機制,有助於深入掌握 LINQ 延遲執行、串流處理等核心概念。

最佳實踐與陷阱

建議說明
勿濫用核心領域邏輯應放在型別內部,擴充方法適合跨領域關注點(序列化、驗證、轉換)
避免擴充基礎型別擴充 object、string 會出現在所有 IntelliSense,造成干擾
保持純函數特性擴充方法最好無副作用、不依賴外部狀態,易於測試與推理
注意 null 檢查this T source 可能為 null,方法內需防禦性檢查
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved