亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#中的擴展方法詳解

2020-01-24 02:27:09
字體:
來源:轉載
供稿:網友

擴展方法使你能夠向現有類型“添加”方法,而無需創建新的派生類型、重新編譯或以其他方式修改原始類型。 擴展方法是一種特殊的靜態方法,但可以像擴展類型上的實例方法一樣進行調用。 以上是msdn官網對擴展方法的描述,現在我通過一個情景例子來對此進行闡釋。假設一個控制臺程序class Program{}里面的主函數如下:

static void Main(string[] args)    {      DateTime now = DateTime.Now;      string time = now.ToString("yyyy-mm-dd hh:mm:ss");       Console.WriteLine(time);      Console.ReadKey();    }

假設需求變了,日期的顯示格式要變成"yyyy-mm-dd"這種格式,當然只需要初始化time時按下面寫法改寫即可:

string time = now.ToString("yyyy-mm-dd");
但是如果要改變日期格式的有很多個類呢?每個都要改一次嗎?這樣一旦需求變來變去就忙死人了。傳統的解決方式是封裝一個幫助類,在里面寫方法,然后供其他類調用。

本例在當前項目模仿添加一個DateHelper類:public class DateHelper{},在類里面定義方法:

public static string DateToString(DateTime dt)    {      return dt.ToString("yyyy-mm-dd hh:mm:ss");    }

于是原來的主函數改寫如下:

static void Main(string[] args)    {      DateTime now = DateTime.Now;      string time = DateHelper.DateToString(now);      Console.WriteLine(time);      Console.ReadKey();    }

此時如果變需求,只需要改寫DateHelp類里的DateToString()方法就行了,不管有多少個類調用此方法,都會被影響。問題解決了,可是這樣要調用另一個類的方法,還是有點麻煩,有沒有什么方法能夠讓我們像now.DateToString()一樣直接調用呢?當然DateTime是微軟寫好的,我們改不了,無法創建想要的實例方法,于是,便引出了擴展方法。
下面是擴展方法的要素:

1.此方法必須是一個靜態方法

2.此方法必須放在靜態類中

3.此方法的第一個參數必須以this開頭,并且指定此方法是擴展自哪個類型

根據以上要素,我們DateHelper類改成靜態類:public static class DateHelper{} ,同時改寫DateToString()方法:

public static string DateToString(this DateTime dt)    {      return dt.ToString("yyyy-mm-dd hh:mm:ss");    }

此時回到主函數方法體,輸入"now."便可以看見自動提示有個DateToString()方法,于是代碼可以這樣寫:

static void Main(string[] args)    {      DateTime now = DateTime.Now;       string time = now.DateToString();      Console.WriteLine(time);      Console.ReadKey();    }

顯而易見,這樣用起來會更加便捷,而且這樣讓我們看起來確實就像是被擴展類型本身具有的實例方法一樣,可讀性很高。下面概括一下擴展方法的特點:

1.擴展方法擴展自哪個類型,就必須是此類型的變量來使用,其他類型無法使用,本例擴展自DateTime類型,就只能是被DateTime類型的變量.出來(now.DateToString())
2.擴展方法中的this后面的參數不屬于方法的參數,本例是無參數,this后面的DateTime dt是指明擴展方法擴展自何種類型
3.如果擴展方法和實例方法具有相同的簽名,則優先調用實例方法
4.擴展自父類上的方法,可以被子類的對象直接使用
5.擴展自接口上的方法,可以被實現類的對象直接使用
6.擴展方法最終還是被編譯器編譯成:靜態類.靜態方法(),本例中now.DateToString()最終還是會被編譯成DateHelper.DateToString(now),這是它的本質

實際上,我們可能會遇到這樣的情景,如在接口擴展一個方法的時候,所有的原本已實現該接口的類都要實現新擴展的方法,這樣的改動是一個很麻煩的工作,可以使用擴展方法“曲線救國”;而有時候我們想為某個類添加新方法卻不想改動這個類,那么擴展方法這種“偽添加”方法的方式就體現出它的價值了。最常見的擴展方法是LINQ標準查詢運算符,運用廣泛,這種方便快捷的方式理應博得碼農們點1024個贊。

“擴展方法使您能夠向現有類型“添加”方法,而無需創建新的派生類型、重新編譯或以其他方式修改原始類型?!?/p>

這是msdn上說的,也就是你可以對String,Int,DataRow,DataTable等這些類型的基礎上增加一個或多個方法,使用時不需要去修改或編譯類型本身的代碼。

先做個例子吧,以String為例,需要在字符串類型中加一個從字符串轉為數值的功能。

以往我們可能是這樣做的,會專門寫一個方法做過轉換

public static int StrToInt(string s){  int id;  int.TryParse(s, out id);//這里當轉換失敗時返回的id為0  return id;}

調用就使用

string s = "abc";int i = StrToInt(s);

若是String類型有一個名為ToInt()(從字符串轉為數值)的方法,就可以這樣調用了

string s = "abc";int i = s.ToInt();

這樣看起來是不是更好,下面來看看具體怎么實現吧

第一步:

我先創建一個解決方案,一個web應用程序(webtest)及一個類庫(W.Common)

在webtest項目添加引用W.Common項目

第二步:在類庫中新建一個名為EString.cs類

using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace W.Common{  public static class EString  {    /// <summary>    /// 將字符串轉換為Int    /// </summary>    /// <param name="t"></param>    /// <returns>當轉換失敗時返回0</returns>    public static int ToInt(this string t)    {      int id;      int.TryParse(t, out id);//這里當轉換失敗時返回的id為0      return id;    }  }}


看了上面的代碼了吧,擴展方法規定類必須是一個靜態類,EString是一個靜態類,里面包含的所有方法都必須是靜態方法。

msdn是這樣規定擴展方法的:“擴展方法被定義為靜態方法,但它們是通過實例方法語法進行調用的。 它們的第一個參數指定該方法作用于哪個類型,并且該參數以 this 修飾符為前綴?!?/p>

EString里有一個ToInt的靜態方法,他接收一個自身參數this,類型為string,this string必須在方法參數的第一個位置。

這句話什么意思,即你需要對string擴展一個ToInt方法,this是string實例化后的對象,這可能說的不太清楚,我的表述能力能弱,不要見怪呀。。。通俗的說就是,擴展方法跟靜態類的名稱無關,只需要在一個靜態類里面定義一個靜態方法,第一個參數必須this string開頭。

如果需要你要對DateTime類型擴展方法名為IsRange(判斷是否在此時間范圍內),代碼如下:

/// <summary>  /// 此時間是否在此范圍內 -1:小于開始時間 0:在開始與結束時間范圍內 1:已超出結束時間  /// </summary>  /// <param name="t"></param>  /// <param name="startTime"></param>  /// <param name="endTime"></param>  /// <returns></returns>  public static int IsRange(this DateTime t, DateTime startTime, DateTime endTime)  {    if (((startTime - t).TotalSeconds > 0))    {      return -1;    }     if (((endTime - t).TotalSeconds < 0))    {      return 1;    }     return 0;  }


這里的擴展方法是用this DateTime打頭,那么就可以這樣調用

time.IsRange(t1,t2);//判斷時間time是否在t1到t2的范圍內
當前代碼在使用擴展方法前需要先引用命名空間

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using W.Common;//這里引用擴展方法所在的命名空間 namespace webtest{  public partial class _Default : System.Web.UI.Page  {    protected void Page_Load(object sender, EventArgs e)    {      use1();      Response.Write("<br />");      use2();    }     /// <summary>    /// 沒有用擴展方法    /// </summary>    private void use1()    {      string s = "abc";      int i = StrToInt(s);      Response.Write("沒有用擴展方法:" + i);    }     /// <summary>    /// 使用擴展方法    /// </summary>    private void use2()    {      string s = "2012";      int i = s.ToInt();      Response.Write("使用擴展方法:" + i);    }     public static int StrToInt(string s)    {      int id;      int.TryParse(s, out id);//這里當轉換失敗時返回的id為0      return id;    }  }}

  以上是我對擴展方法理解及使用,如有不對或不足的地方請多多指正,謝謝啦。。

  這我第一次寫文章算是排過版的,用好長時間呀,以前都只是看別人的文章,現在才知道寫一篇好的文章真的不容易呀。

  努力學習,堅持自己的夢想。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩免费观看视频| 国产一区在线播放| 国产精品嫩草影院久久久| 国产网站欧美日韩免费精品在线观看| 日韩亚洲在线观看| 中文字幕亚洲一区在线观看| 性色av一区二区咪爱| 黑人巨大精品欧美一区二区免费| 国产精品扒开腿做爽爽爽的视频| 美女av一区二区| 欧美精品激情在线| 国产精品久久久久久久久久久不卡| 欧美日韩国产精品专区| 欧美在线欧美在线| 成人亲热视频网站| 国产成人精品久久二区二区91| 国产精品日韩精品| 欧美成人精品在线| 久久久久久久97| 亚洲在线第一页| 久久精品视频免费播放| 国产成人啪精品视频免费网| 亚洲少妇中文在线| 欧洲成人免费视频| 欧美二区在线播放| 欧美激情免费观看| yw.139尤物在线精品视频| 亚洲天堂男人天堂| 欧美怡春院一区二区三区| 欧美日韩一区二区三区| 欧美日韩激情视频8区| 亚洲国产精品成人av| 久久久久99精品久久久久| 亚洲精品视频久久| 在线观看欧美www| 欧美激情在线观看视频| 欧美日本中文字幕| 国语自产精品视频在免费| 国产一区二区三区网站| 中文字幕日韩专区| 日韩在线观看免费全集电视剧网站| 欧美激情精品久久久久| 欧美午夜激情在线| 久久久久久久久久久av| 91热精品视频| 国产婷婷97碰碰久久人人蜜臀| zzijzzij亚洲日本成熟少妇| 亚洲最大福利网| 久久久久这里只有精品| 日韩最新av在线| 欧美在线一级va免费观看| 97视频在线观看播放| 欧美激情一级欧美精品| 亚洲欧洲高清在线| 亚洲欧洲日产国产网站| 57pao国产精品一区| 日韩欧美中文字幕在线播放| 欧美视频中文在线看| 日韩视频在线一区| 日韩高清电影好看的电视剧电影| 久久影院免费观看| 91系列在线观看| 亚洲精美色品网站| 亚洲国产美女久久久久| 欧美激情第99页| 色婷婷av一区二区三区在线观看| 亚洲乱码一区二区| 久久激情视频免费观看| 精品国产一区二区三区久久久狼| 欧美视频一区二区三区…| 国产精品久久久久久久久男| 69久久夜色精品国产69| www.欧美视频| 成人免费网站在线观看| 久久久www成人免费精品张筱雨| 精品精品国产国产自在线| 欧美性jizz18性欧美| 日韩精品视频在线观看免费| 亚洲欧美自拍一区| 第一福利永久视频精品| 成人免费直播live| 日韩小视频网址| 久久精品亚洲国产| xxxxx成人.com| 91沈先生在线观看| 一个人看的www久久| 91九色精品视频| 91视频国产一区| 亚洲毛片在线免费观看| 日韩精品中文字幕在线播放| 亚洲国产女人aaa毛片在线| 国产精品免费久久久久影院| 97av在线视频免费播放| 日韩欧美有码在线| 在线成人免费网站| 国产免费一区二区三区在线观看| 在线播放亚洲激情| 亚洲精品中文字| 国产精品第1页| 国产亚洲精品美女| 欧美一级视频一区二区| 日韩精品免费视频| 富二代精品短视频| 欧美日韩精品在线播放| 茄子视频成人在线| 欧美性生交xxxxx久久久| 国产精品久久久久久久久久ktv| 国产精品久久国产精品99gif| 欧美激情视频三区| 久久人人爽亚洲精品天堂| 欧美激情亚洲综合一区| 懂色av中文一区二区三区天美| 亚洲香蕉伊综合在人在线视看| 日韩av理论片| 欧美日韩国产成人在线| 夜夜嗨av色一区二区不卡| 疯狂做受xxxx欧美肥白少妇| 黄色91在线观看| 中国人与牲禽动交精品| 精品在线观看国产| 激情亚洲一区二区三区四区| 欧美激情一区二区三级高清视频| 日本欧美爱爱爱| 在线看欧美日韩| 亚洲精品永久免费| 18一19gay欧美视频网站| 亚洲欧美三级伦理| 亚洲欧美在线看| 亚洲视频在线观看网站| 91av中文字幕| 成人精品一区二区三区电影黑人| 国外成人在线直播| 久久人人爽人人| 亚洲欧美成人在线| 亚洲最大av网站| 日韩视频免费在线观看| 日韩不卡在线观看| 国产日韩精品电影| 亚洲免费小视频| 国产精品夜间视频香蕉| 精品国产一区二区三区久久狼黑人| 精品中文字幕在线观看| 日韩av综合中文字幕| 国产精品久久久| 日韩av在线精品| 亚洲精品乱码久久久久久金桔影视| 亚洲国产第一页| 成人a视频在线观看| 日韩在线观看网址| 久久久久久久一区二区三区| 成人激情视频小说免费下载| 亚洲男人av在线| 国产日韩欧美电影在线观看| 欧洲亚洲在线视频| 久久天天躁日日躁| 亚洲精品中文字幕av| 久久综合网hezyo| 亚洲精品日韩激情在线电影| 欧美性精品220| 日本人成精品视频在线| 欧美一二三视频| 亚洲成人精品视频在线观看| 欧美激情aaaa| 美女国内精品自产拍在线播放|