第一.使用方便:定義好某個類型的擴展方法後,只 要是在這個類型後面點一個“.",就可以找到所有的擴展方法;而不 用像以前先要找到方法所放的那個類,然後用通過調用該類的方法來實現;(很 多時候,公共類庫和實際調用是不同開發人員開發的,往往需要調用的人員不知 道哪個類有哪些功能可以使用,這個在公共類庫比較龐大的時候很麻煩)
第二.擴展方便:可以很方便的擴展底層類庫,接口,第三方類庫(控件 ,插件)等等,在上面添加我們需要的功能;而不需要我們重新修改這些底層類 庫,控件等(有很多時候這些東西我們根本沒有辦法更改,例如第三方提供的, 非開源的);
擴展方法幾種使用情況:
1.傳遞參數:
public static class Extensions{
//this必須放 第一個位置,後面傳遞參數類型沒有限制
public static void Foo(this string s,string pName) {
…
}
}
使用:
String s=“Hello,World”;
s.Foo ("maotin");
2.擴展方法的優先級:
注意擴展 方法的優先級:現有實例方法優先級最高,其次為最近的namespace下的靜態類 的靜態方法,最後為較遠的namespace下的靜態類的靜態方法。
//下面這 段從網友博客中拷貝修改(原文地址: http://blog.joycode.com/ghj/archive/2007/06/06/103872.ASPx)
情 況一 : 擴展方法跟原來類的方法重名時候的處理邏輯。
namespace Hongjun.Guo
{
public class MyClass
{
public void Print()
{
Console.WriteLine("****");
}
} static class MyExtensionMethods
{
internal static void Print(this MyClass s)
{
Console.WriteLine("haha " + s.ToString());
}
}
}
調用范例:
using Hongjun.Guo;
static void Main(string[] args)
{
MyClass o = new MyClass();
o.Print();
Console.ReadLine();
}
這時候我們會看到何種結果呢??
答案:看到的是 ****
分析:
我們把上述兩組代碼編譯後 ,再反編譯成IL,我們就可以看到,實際上,擴展方法在IL層上是不存在的。
擴展方法實際是編譯器調用某個類的某個方法的時候,先去這個類找, 如果有這個方法,則就調用;如果找不到,根據引用的命名空間,再去找擴展方 法(靜態類的靜態方法)。找到,就使用,找不到當然就編譯錯誤了。
根據這個分析結果,我們就可以理解上述問題處理的結果了。