日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#扩展方法知多少

發布時間:2025/6/15 C# 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#扩展方法知多少 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

看過Demo的朋友可能注意到了里面就用到過泛型的擴展方法,本篇打算總結下C#擴展方法的用法。博主打算分三個層面來介紹這個知識點,分別是:.Net內置對象的擴展方法、一般對象的擴展方法、泛型對象的擴展方法。

? ? ?什么是擴展方法?回答這個問題之前,先看看我們一般情況下方法的調用。類似這樣的通用方法你一定寫過:

????????static?void?Main(string[]?args){????????????string?strRes?=?"2013-09-08?14:12:10";????????????var?dRes?=?GetDateTime(strRes);}????//將字符串轉換為日期public?static?DateTime?GetDateTime(string?strDate){????????????return?Convert.ToDateTime(strDate);}????????//得到非空的字符串public?static?string?GetNotNullStr(string?strRes){????????????if?(strRes?==?null)????????????????return?string.Empty;????????????elsereturn?strRes;}

或者在項目中有一個類似Utils的工具類,里面有多個Helper,例如StringHelper、XmlHelper等等,每個Helper里面有多個static的通用方法,然后調用的時候就是StringHelper.GetNotNullStr("aa");這樣。還有一種普通的用法就是new 一個對象,通過對象去調用類里面的非static方法。反正博主剛開始做項目的時候就是這樣寫的。后來隨著工作經驗的累積,博主看到了擴展方法的寫法,立馬就感覺自己原來的寫法太Low了。進入正題。

?

1、.Net內置對象的擴展方法

.Net內部也有很多定義的擴展方法,例如我們Linq常用的Where(x=>x==true)、Select()等等。當你轉到定義的時候你很容易看出來:public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)。當然我們也可以給.Net對象新增擴展方法,比如我們要給string對象加一個擴展方法(注意這個方法不能和調用的Main方法放在同一個類中):

????????public?static?string?GetNotNullStr(this?string?strRes){????????????if?(strRes?==?null)????????????????return?string.Empty;????????????elsereturn?strRes?;}

然后在Main方法里面調用:

????????static?void?Main(string[]?args){????????????string?strTest?=?null;????????????var?strRes?=?strTest.GetNotNullStr();}

簡單介紹:public static string GetNotNullStr(this string strRes)其中this string就表示給string對象添加擴展方法。那么在同一個命名空間下面定義的所有的string類型的變量都可以.GetNotNullStr()這樣直接調用。strTest.GetNotNullStr();為什么這樣調用不用傳參數,是因為strTest就是作為參數傳入到方法里面的。你可以試試。使用起來就和.Net framework定義的方法一樣:

?

? ? ?當然除了string,你可以給.Net內置的其他對象加擴展方法,例如給DataGridViewRow的擴展方法:

?View Code

這樣看上去就像在擴展.Net Framework。有沒有感覺有點高大上~

?

2、一般對象的擴展方法

? ? ?和Framework內置對象一樣,自定義的對象也可以增加擴展方法。直接上示例代碼:

????public?class?Person{????????public?string?Name?{?set;?get;?}????????public?int?Age?{?set;?get;?}}

????????//Person的擴展方法,根據年齡判斷是否是成年人public?static?bool?GetBIsChild(this?Person?oPerson){????????????if?(oPerson.Age?>=?18)????????????????return?false;????????????elsereturn?true;}

Main方法里面調用:

var?oPerson1?=?new?Person(); oPerson1.Age?=?20;var?bIsChild?=?oPerson1.GetBIsChild();

和string擴展方法類似,就不多做解釋了。

?

3、泛型對象的擴展方法

? ? ? 除了上面兩種之外,博主發現其實可以定義一個泛型的擴展方法。那么,是不是所有的類型都可以直接使用這個擴展方法了呢?為了保持程序的嚴謹,下面的方法可能沒有實際意義,當開發中博主覺得可能存在這種場景:

public?static?class?DataContractExtensions {??//測試方法public?static?T?Test<T>(this?T?instance)?where?T?:?Test2{T?Res?=?default(T);???????try{Res.AttrTest?=?instance.AttrTest.Substring(0,2);???????????//其他復雜邏輯...}??????catch{?}??????return?Res;}}public?class?Test2 {public?string?AttrTest?{?set;?get;?} }

?

使用擴展方法有幾個值得注意的地方:

(1)擴展方法不能和調用的方法放到同一個類中

(2)第一個參數必須要,并且必須是this,這是擴展方法的標識。如果方法里面還要傳入其他參數,可以在后面追加參數

(3)擴展方法所在的類必須是靜態類

(4)最好保證擴展方法和調用方法在同一個命名空間下

?

? ? ? 可能你第一次使用這個會覺得很別扭。你也許會說擴展方法和我以前用的static方法無論從代碼實現還是算法效率都差不多嘛,是的!確實差不多,但使用多了之后會發現它確實能幫你省去很多代碼。

?


轉載于:https://blog.51cto.com/liuyuanxing/1926355

總結

以上是生活随笔為你收集整理的C#扩展方法知多少的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。