程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#3.0新體驗(二)(2)

C#3.0新體驗(二)(2)

編輯:關於C語言
 什麼使用擴展方法?

第一.使用方便:定義好某個類型的擴展方法後,只 要是在這個類型後面點一個“.",就可以找到所有的擴展方法;而不 用像以前先要找到方法所放的那個類,然後用通過調用該類的方法來實現;(很 多時候,公共類庫和實際調用是不同開發人員開發的,往往需要調用的人員不知 道哪個類有哪些功能可以使用,這個在公共類庫比較龐大的時候很麻煩)

第二.擴展方便:可以很方便的擴展底層類庫,接口,第三方類庫(控件 ,插件)等等,在上面添加我們需要的功能;而不需要我們重新修改這些底層類 庫,控件等(有很多時候這些東西我們根本沒有辦法更改,例如第三方提供的, 非開源的);

擴展方法幾種使用情況:

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層上是不存在的。

擴展方法實際是編譯器調用某個類的某個方法的時候,先去這個類找, 如果有這個方法,則就調用;如果找不到,根據引用的命名空間,再去找擴展方 法(靜態類的靜態方法)。找到,就使用,找不到當然就編譯錯誤了。

根據這個分析結果,我們就可以理解上述問題處理的結果了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved