擴充方法。
相信大家都已經聽說過或已經用過這個新特性,這個也是我所喜歡的新特性之一.
當我們需要對已有類的功能進行擴充時,我們通常會想到繼承,繼承已有類,然後為其加入新的行為。而C# 3.0中加入的擴充方法特性,則提供了另一種實現功能擴充的方式,我們可以在不使用繼承的前提下實現對已有類本身的擴充,這種方法並不會產生新的類型,而是採用向已有類中加入新方法的方式來完成功能擴充。
在對已有類進行擴充時,我們需將所有擴充方法都寫在一個靜態類中,這個靜態類就相當於存放擴充方法的容器,所有的擴充方法都可以寫在這裡面。而且擴充方法採用一種全新的聲明方式:
public static 傳回型別 擴充方法名(this 要擴充的類型 sourceObj [,擴充方法參數列表])
與普通方法聲明方式不同,擴充方法的第一個參數以this關鍵字開始,後跟被擴充的類型名,然後才是真正的參數列表。下面是使用樣本:
namespace JackDong.CSharp3Feature
{
public static class MethodExtend
{
public static bool OutLength(this string str){
if(str.Length>10)return true;
return false;
}
}
}
如果你想調用這個函數可以在你所有調用的類中引入所在的命名空間(using JackDong.CSharp3Feature;)
然後就可以在自己的方法中調用這個方法:string.OutLength(yourstring);
是不是很神奇。
大家都知道Object是所有類的始祖,如果擴充Object的方法會怎麼樣呢?在所有類中都能調用你所擴充的方法,在這裡就不在贅述,不信你可以試一下.
另例:
namespace JackDong.CSharp3Feature
{
static class Extensions
{
public static int ToInt32(this string source)
{
return Int32.Parse(source);
}
public static T[] Slice<T>(this T[] source, int index, int count)
{
if (index < 0 || count < 0 || index + count > source.Length)
{
throw new ArgumentException();
}
T[] result = new T[count];
Array.Copy(source, index, result, 0, count);
return result;
}
}
class ExtensionMethods : AppRunner.AbstractApplication
{
public override void Run()
{
string number = "123";
Console.WriteLine(number.ToInt32());
int[] intArray = new int[] { 1, 2, 3 };
intArray = intArray.Slice(1, 2);
foreach (var i in intArray)
Console.WriteLine(i);
}
}
}
在上面的樣本中,靜態Extensions類中有兩個擴充方法,第一個方法是對string類的擴充,它為string類加入了名為ToInt32的方法,該方法沒有參數,並返回一個int類型的值,它將完成數字字元向整數的轉換。有了這個擴充方法之後,就可對任意string類的對象調用ToInt32方法了,該方法就像其本身定義的一樣。
第二個擴充方法是一個泛型方法,它是對所有數群組類型的擴充,該方法完成數組的切片操作。
C# 3.0中的Linq運算式,就是大量運用擴充方法來實現資料查詢的。