日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
C#調(diào)用擴展方法剖析

擴展方法是一種特殊的靜態(tài)方法,它定義在一個靜態(tài)類中,但可以在其他類的對象上像調(diào)用實例方法那樣進行調(diào)用。因此,通過擴展方法,我們就可以在不修改一個類型的前提下對一個類型進行功能上的擴充;同時,也可以將一些近似的類型中近似的功能同一實現(xiàn)在一個類中,便于閱讀和維護。

另外,擴展方法的引入并非只是簡單地為了擴展現(xiàn)有類型,擴展方法的使用還是有一定限制的(這將在稍后談到)。擴展方法更大的意義在于它為以后將要介紹的查詢表達式、查詢表達式模式和標準查詢運算符的實現(xiàn)奠定了基礎(chǔ),而這些實現(xiàn)正是Linq項目的核心所在。

C#調(diào)用擴展方法

擴展方法和一般靜態(tài)方法的定義方法類似,***的區(qū)別是在***個參數(shù)的前面要加上關(guān)鍵字this作為修飾符;同時,***個參數(shù)的類型也決定了擴展方法可以擴展的類型。

為了介紹擴展方法的定義和使用方法,首先我們定義下面這樣一個簡單的類作為被擴展對象:

 
 
 
  1. class SampleClass
  2. {
  3. int m_val = 10;
  4. public int Val { get { return m_val; } set { m_val = value; } }
  5. public void Func()
  6. {
  7. Console.WriteLine("Hey! I’m myself, and my value is {0}.", m_val);
  8. }
  9. }

這個類擁有一個公共可讀寫屬性Val,并有一個私有域m_val用于存放這個屬性的值。另外,這個類自身還擁有一個公共方法Func,用來在屏幕上顯示以行信息,說明該方法被調(diào)用了。

然后,我們定義一個靜態(tài)類型SampleExtensions(這個名字是隨意的,只有將擴展方法作為普通的靜態(tài)方法進行調(diào)用時才會用到這個名字),其中定義一個用于擴充SampleClass類型的擴展方法ExFunc:

 
 
 
  1. static class SampleExtensions
  2. {
  3. public static void ExFunc(this SampleClass s)
  4. {
  5. Console.WriteLine("Aha! I’m going to modify the SampleClass!");
  6. s.Val = 20;
  7. s.Func();
  8. }
  9. }

注意這個方法的***個參數(shù)(也是僅有的一個參數(shù))的類型前面多了一個修飾符this,這表明該方法用來擴展SampleClass類型,也就是說可以在SampleClass類型的對象上像調(diào)用實例方法那樣調(diào)用ExFunc方法。該方法首先告訴用戶它正在被調(diào)用,然后修改SampleClass類型的對象的屬性,并調(diào)用它的實例方法。

接下來,我們在Main方法中創(chuàng)建SampleClass類型的一個實例,并嘗試調(diào)用其實例方法和上面定義的擴展方法:

 
 
 
  1. SampleClass s = new SampleClass();
  2. Console.WriteLine("Calling the instance method:");
  3. s.Func();
  4. Console.WriteLine();
  5. Console.WriteLine("Calling the extension method:");
  6. s.ExFunc();

當然,由于擴展方法只是靜態(tài)方法的一種特例,我們同樣可以像用調(diào)用一般靜態(tài)方法那樣來C#調(diào)用擴展方法。

這會得到完全一樣的結(jié)果。而且事實上,編譯器也正是將C#調(diào)用擴展方法翻譯為了一般形式的靜態(tài)方法調(diào)用,然后才進行進一步的編譯。

擴展方法不僅能擴展同一個程序集中的類型,同時也能擴展不同程序集甚至是已經(jīng)發(fā)布了的程序集中的類型。下面我們就在SampleExtensions中再添加一個擴展方法,用來擴展.net Framework的內(nèi)建類型String(這個例子摘錄自C# 3.0語言規(guī)范,版權(quán)歸微軟公司所有。)

 
 
 
  1. public static int ToInt32(this string s)
  2. {
  3. return Int32.Parse(s);
  4. }
  5. //然后,我們就可以象下面這樣方便地將一個字符串轉(zhuǎn)換為一個整型了:
  6. string sval = "20";
  7. Console.WriteLine("String ’20’ means integer: {0}.", sval.ToInt32());
  8. //嘗試運行這段代碼,會得到如下結(jié)果:
  9. String ’20’ means integer: 20.

簡單地瀏覽一下.NET Framework的文檔就會發(fā)現(xiàn),System.String類型中的確沒有定義ToInt32方法,這說明我們的擴展方法在.NET Framework內(nèi)建類型上仍然有效。


當前文章:C#調(diào)用擴展方法剖析
轉(zhuǎn)載來源:http://www.dlmjj.cn/article/dpoghjh.html