C#擴(kuò)展方法實(shí)例分析
本文實(shí)例講述了C#擴(kuò)展方法。分享給大家供大家參考,具體如下:
擴(kuò)展方法
擴(kuò)展方法使您能夠向現(xiàn)有類(lèi)型“添加”方法,而無(wú)需創(chuàng)建新的派生類(lèi)型、重新編譯或以其他方式修改原始類(lèi)型。擴(kuò)展方法是一種特殊的靜態(tài)方法,但可以像擴(kuò)展類(lèi)型上的實(shí)例方法一樣進(jìn)行調(diào)用。對(duì)于用 C# 和 Visual Basic 編寫(xiě)的客戶端代碼,調(diào)用擴(kuò)展方法與調(diào)用在類(lèi)型中實(shí)際定義的方法之間沒(méi)有明顯的差異。
如果我們有這么一個(gè)需求,將一個(gè)字符串的第一個(gè)字符轉(zhuǎn)化為大寫(xiě),第二個(gè)字符到第n個(gè)字符轉(zhuǎn)化為小寫(xiě),其他的不變,那么我們?cè)撊绾螌?shí)現(xiàn)呢?
不使用擴(kuò)展方法:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ExtraMethod
{
//抽象出靜態(tài)StringHelper類(lèi)
public static class StringHelper
{
//抽象出來(lái)的將字符串第一個(gè)字符大寫(xiě),從第一個(gè)到第len個(gè)小寫(xiě),其他的不變的方法
public static string ToPascal(string s,int len)
{
return s.Substring(0, 1).ToUpper() + s.Substring(1, len).ToLower() + s.Substring(len + 1);
}
}
class Program
{
static void Main(string[] args)
{
string s1 = "aSDdAdfGDFSf";
string s2 = "sbfSDffsjG";
Console.WriteLine(StringHelper.ToPascal(s1,3));
Console.WriteLine(StringHelper.ToPascal(s2, 5));
}
}
}

使用擴(kuò)展方法:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ExtraMethod
{
class Program
{
static void Main(string[] args)
{
string s1 = "aSDdAdfGDFSf";
string s2 = "sbfSDffsjG";
Console.WriteLine(s1.ToPascal(3));
Console.WriteLine(s2.ToPascal(5));
}
}
//擴(kuò)展類(lèi),只要是靜態(tài)就可以
public static class ExtraClass
{
//擴(kuò)展方法--特殊的靜態(tài)方法--為string類(lèi)型添加特殊的方法ToPascal
public static string ToPascal(this string s, int len)
{
return s.Substring(0, 1).ToUpper() + s.Substring(1, len).ToLower() + s.Substring(len + 1);
}
}
}

通過(guò)上面兩種方法的比較:
1.代碼在訪問(wèn)ToPascal這樣的靜態(tài)方法時(shí)更為便捷。用起來(lái)就像是被擴(kuò)展類(lèi)型確實(shí)具有該實(shí)例方法一樣。
2.擴(kuò)展方法不改變被擴(kuò)展類(lèi)的代碼,不用重新編譯、修改、派生被擴(kuò)展類(lèi)
定義擴(kuò)展方法
1.定義一個(gè)靜態(tài)類(lèi)以包含擴(kuò)展方法。
2.該類(lèi)必須對(duì)客戶端代碼可見(jiàn)。
3.將該擴(kuò)展方法實(shí)現(xiàn)為靜態(tài)方法,并使其至少具有與包含類(lèi)相同的可見(jiàn)性。
4.方法的第一個(gè)參數(shù)指定方法所操作的類(lèi)型;該參數(shù)必須以 this 修飾符開(kāi)頭。
請(qǐng)注意,第一個(gè)參數(shù)不是由調(diào)用代碼指定的,因?yàn)樗硎菊龖?yīng)用運(yùn)算符的類(lèi)型,并且編譯器已經(jīng)知道對(duì)象的類(lèi)型。 您只需通過(guò) n 為這兩個(gè)形參提供實(shí)參。
注意事項(xiàng):
1.擴(kuò)展方法必須在靜態(tài)類(lèi)中定義
2.擴(kuò)展方法的優(yōu)先級(jí)低于同名的類(lèi)方法
3.擴(kuò)展方法只在特定的命名空間內(nèi)有效
4.除非必要不要濫用擴(kuò)展方法
更多關(guān)于C#相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《C#窗體操作技巧匯總》、《C#數(shù)據(jù)結(jié)構(gòu)與算法教程》、《C#常見(jiàn)控件用法教程》、《C#面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)教程》及《C#程序設(shè)計(jì)之線程使用技巧總結(jié)》
希望本文所述對(duì)大家C#程序設(shè)計(jì)有所幫助。
相關(guān)文章
C# TSC打印二維碼和條形碼的實(shí)現(xiàn)方法
下面小編就為大家分享一篇C# TSC打印二維碼和條形碼的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
C#結(jié)合JavaScript實(shí)現(xiàn)手寫(xiě)板簽名效果
這篇文章主要為大家詳細(xì)介紹了C#如何結(jié)合JavaScript實(shí)現(xiàn)手寫(xiě)板寫(xiě)字并上傳到服務(wù)器進(jìn)行處理,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-04-04
可替代log4j日志的c#簡(jiǎn)單日志類(lèi)隊(duì)列實(shí)現(xiàn)類(lèi)代碼分享
簡(jiǎn)單日志類(lèi)隊(duì)列實(shí)現(xiàn)。可按天周月年大小分割文件。可簡(jiǎn)單替代log4j2013-12-12
C#中多態(tài)現(xiàn)象和多態(tài)的實(shí)現(xiàn)方法
這篇文章主要介紹了C#中多態(tài)現(xiàn)象和多態(tài)的實(shí)現(xiàn)方法,較為詳細(xì)的分析了多態(tài)的原理與C#實(shí)現(xiàn)多態(tài)的方法,以及相關(guān)的注意事項(xiàng),需要的朋友可以參考下2015-05-05
C# 無(wú)需COM組件創(chuàng)建快捷方式的實(shí)現(xiàn)代碼
做一個(gè)小程序, 需要?jiǎng)?chuàng)建快捷方式, 網(wǎng)上普遍的做法是引入 COM 組件, 雖然也挺方便的, 但引入之后, 程序就需要多帶一個(gè) dll 文件, 這樣, 想做成單文件便攜版就不行了2011-05-05

