在最近的學習中,發現了一種用起來特別爽的C#特性——擴展方法,之前拜讀《大話設計模式》一書的時候,書中提到這樣一句話:“反射,反射,程序員的快樂”,本人菜鳥一只,到現在還未曾使用過反射,對于其是否真的快樂自然無從體會,不過擴展方法用起來稱得上是相當快樂!
擴展方法使你能夠向現有類型”添加“方法,而無需創建新的派生類型、重新編譯或以其他方法修改原始類型。擴展方法是一種特殊的靜態方法,但可以像擴展類型上的實力方法一樣進行調用。對于C#和Visual Basic 編寫的客戶端代碼,調用擴展方法與調用在類型中實際定義的方法之間沒有明顯的差異。
——MSDN中對于擴展方法的解釋
剛開始學習C#的時候,經常碰到各種需要狀態轉換的場合,那個時候代碼里常常是大坨大坨的Convert.ToXX();當時非常羨慕String類可以直接調用ToString方法,省時省力,代碼看起來還特別美觀,之后學會了把Convert.ToXX()打包到一個方法里,代碼不那么冗余了,但還是不甚美觀,且費時費力,直到今天,我發現了C#中這個讓人激爽無比的特性,這件事情終于有了完美的解決方案!
下面來看一下基本的語法:
public static 返回類型 方法名(this 需要添加擴展方法的類名 變量名,,,){    return;}舉個栗子:
首先我們寫這樣一個類:
namespace ExtensionMethods{ public static class ExtensionMethods { public static int ToInt(this string s) { return Convert.ToInt32(s); } }}
然后只需要在另一個類中引用這個類的命名空間,就可以方便地使用我們寫好的擴展方法進行類型轉換了:
using ExtensionMethods;namespace xxx{ public static class xxxx { public static int Test() { int i = "123".ToInt(); } }}
怎么樣?是不是感覺一股涼氣當頭灌下——真爽啊!
別急,光這樣怎么能夠滿足我們的需求呢,接下來我們繼續優化
1.每次還需要引用命名空間,太浪費時間精力
解決方案:將擴展方法直接放到類型所在的命名空間下
依舊以上面的代碼為例,就是:
namespace System{ public static class ExtensionMethods { public static int ToInt(this string s) { return Convert.ToInt32(s); } }}
這樣,我們在項目中加入了這個類之后,在項目的任何位置就都可以來方面的由String轉化為Int了
但是這樣就夠了么?No!No!No!,舉個栗子,如果參數String并不是數字類型的時候會怎么樣呢?
2.如果輸入的String并不能轉化為數字,會報錯
解決方案:加入另一個參數為默認值,若不能轉化成功,則返回默認值
代碼如下:
public static int ToInt32(this string s, int def = default(int)){ int result; return Int32.TryParse(s, out result) ? result : def;}
按照上面的思路,我們可以打包一個包含各種常用類型轉換的類,寫程序的時候只要直接加入這個類,就可以方便地進行各種進制轉換了.
下面提供一個自用的Convert類Convert.zip
新聞熱點
疑難解答