2014年7月11日 星期五

[C#] Extension Method

C#3.0之後提供extension method這個功能,簡單來說就是讓你在現有的type中加入新的的method。一般是用在內建型態或是sealed class上,一般的type我們可以透過繼承的方式來加入新method,但是我們沒辦法修改內建型態,因此extension method就派上用場了。
Extension會有以下這些特徵:
  1. 必須在非generic的static class中,並且宣告為static method
  2. Method最少要有一個參數
  3. 第一個參數用this關鍵字宣告
  4. 第一個參數不能有this以外的修飾詞,例如out或ref
  5. 第一個參數型態不能是pointer type
以下是一個extension method的範例
public static class StringHelper
{
    public static bool IsCapitalized (this string s)
    {
        if (string.IsNullOrEmpty(s)) return false;
        return char.IsUpper(s[0]);
    }
}
IsCapitalized就是string type的extension method,我們可以這樣使用它:
Console.WriteLine("Test".IsCapitalized());
其實這段呼叫在編譯時候會被修改成去呼叫static method,背後的細節被compiler隱藏起來。
Console.WriteLine(StringHelper.IsCapitalized("Test"));
總結一下,extension method背後會做以下轉換:
arg0.Method(arg1, arg2, ...);  // Extension method call
StaticClass.Method(arg0, arg1, arg2, ...);  // Static method call
Interface也可以被extended,範例如下:
public static T First (this IEnumerable sequence)
{
    foreach (T element in sequence)
        return element;

    throw new InvalidOperationException("No elements!");
}
...
Console.WriteLine("Test".First());   // Output: T

沒有留言:

張貼留言