跳轉到內容

C# 程式設計/擴充套件方法

來自華夏公益教科書,自由的教學叢書

擴充套件方法是 C# 3.0 中的新功能,允許您使用自己的方法擴充套件現有型別。 儘管它們是靜態的,但它們的使用方式就像是被擴充套件的類的普通方法一樣。 因此,可以向現有類新增新功能,而無需更改或重新編譯該類本身。 但是,由於它們不是類的一部分,擴充套件無法訪問私有或受保護的方法、屬性或欄位。

擴充套件方法應在 static 類中建立。 它們本身應該是 static 的,並且應該至少包含一個引數,第一個引數前面帶有 this 關鍵字

public static class MyExtensions
{
    public static string[] ToStringArray<T>(this List<T> list)
    {
        string[] array = new string[list.Count];

        for (int i = 0; i < list.Count; i++)
            array[i] = list[i].ToString();

        return array;
    }

    // to be continued...
}

第一個引數的型別(在本例中為 List<T>)指定擴充套件方法可用的型別。 現在,您可以像這樣呼叫擴充套件方法

List<int> list = new List<int>();

list.Add(1);
list.Add(2);
list.Add(3);

string[] strArray = list.ToStringArray(); // strArray will now contain "1", "2" and "3".

以下是程式的其餘部分

using System;
using System.Collections.Generic;

public static class MyExtensions
{
    ... // continued from above

    public static void WriteToConsole(this string str)
    {
        Console.WriteLine(str);
    }

    public static string Repeat(this string str, int times)
    {
        System.Text.StringBuilder sb = new System.Text.StringBuilder();

        for (int i = 0; i < times; i++)
            sb.Append(str);

        return sb.ToString();
    }
}

class ExtensionMethodsDemo
{
    static void Main()
    {
        List<int> myList = new List<int>();
        
        for (int i = 1; i <= 10; i++)
            myList.Add(i);
        
        string[] myStringArray = myList.ToStringArray();
        
        foreach (string s in myStringArray)
            s.Repeat(4).WriteToConsole(); // string is extended by WriteToConsole()
        
        Console.ReadKey();
    }
}

請注意,擴充套件方法可以透過定義多個引數(沒有 this 關鍵字)來接受引數。

華夏公益教科書