資源描述:
《c# 方法:分布、擴展、匿名和普通方法》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、c#方法:分布、擴展、匿名和普通方法一.概述:萬事萬物皆對象,孫悟空是個對象,他會摘桃子,是一種行為,這種行為就是c#中的方法,方法是有指定功能的代碼塊。說起方法就得說一下方法的簽名:修飾符、返回值類型、方法參數(shù)。在定義方法時的參數(shù)叫“形式參數(shù)(形參)”,在調(diào)用方法時的參數(shù)叫“實際參數(shù)(實參)”。這些基本了解之后,下面開始談幾類方法:分布、擴展、匿名和普通方法。二.分布方法:要說分布方法要先說分布類:在VisualStudio中創(chuàng)建一個Windows窗體應(yīng)用程序,打開窗體Form1的代碼部分和Fo
2、rm1.Designer.cs文件,如圖Form1類的修飾符有個partial關(guān)鍵字,沒錯,partial關(guān)鍵字就是表示此類或此方法為分布類或分布方法的,上面的例子把分布類或分布方法的好處已經(jīng)體現(xiàn)了:可以讓一個類分布在多個文件,這樣就可以讓多個程序員編寫了,也可以讓一個類的幾個功能塊分布在多個文件中。注意:a.partial關(guān)鍵字只能修飾類、結(jié)構(gòu)或方法。分布方法只能存在于分布類或分布結(jié)構(gòu)中。b.partial是VisualStudio的關(guān)鍵字,不是C#語法的關(guān)鍵字。在最終編譯的時候,分布類會統(tǒng)一編
3、譯成一個類,如果分布方法未提供該實現(xiàn),則會在編譯時移除方法以及對方法的所有調(diào)用。c.各個部分必須具有相同的可訪問性,如public、private等。d.如果將任意部分聲明為抽象的,則整個類型都被視為抽象的,如果將任意部分聲明為密封的,則整個類型都被視為密封的,如果任意部分聲明基類型,則整個類型都將繼承該類。指定基類的所有部分必須一致,但忽略基類的部分仍繼承該基類型,各個部分可以指定不同的基接口,最終類型將實現(xiàn)所有分部聲明所列出的全部接口。e.分部方法聲明必須以上下文關(guān)鍵字partial開頭,并且
4、方法必須返回void。f.分部方法可以有ref參數(shù),但不能有out參數(shù)。g.分部方法為隱式private方法,因此不能為virtual方法。h.分部方法不能為extern方法,因為主體的存在確定了方法是在定義還是在實現(xiàn)。i.分部方法可以有static和unsafe修飾符。j.分部方法可以為泛型的。約束將放在定義分部方法聲明上,但也可以選擇重復(fù)放在實現(xiàn)聲明上。參數(shù)和類型參數(shù)名稱在實現(xiàn)聲明和定義聲明中不必相同。a.不能將委托轉(zhuǎn)換為分部方法。一.?dāng)U展方法:擴展方法使您能夠向現(xiàn)有類型“添加”方法,而無需創(chuàng)
5、建新的派生類型、重新編譯或以其他方式修改原始類型。擴展方法必須是靜態(tài)的,第一個參數(shù)指定該方法作用于哪個類型,并且該參數(shù)以this修飾符為前綴。舉例說明:namespaceHelloWorld{usingIamExtend;classProgram{staticvoidMain(string[]args){stringstr="helloworld";Console.WriteLine(str.IamExt());//helloworld,IamExtend}}}namespaceIamExtend
6、{staticclassExtString{publicstaticstringIamExt(thisstringstr){str+=",IamExtend";returnstr;}}}細心的話會有一個疑問:IamExt是靜態(tài)方法,而在調(diào)用的時候是變量str點出來的,能用變量點出來的方法不是實例化方法嗎?在這里,不是!擴展方法是一種特殊的靜態(tài)方法,但在代碼中可以像擴展類型上的實例方法一樣進行調(diào)用,實際上,編譯器生成的中間語言(IL)會將代碼轉(zhuǎn)換為對靜態(tài)方法的調(diào)用。深入思考一下:類有封裝性,而上例中
7、的string是由微軟定義,并且已經(jīng)封裝,而擴展類ExtString和string并沒有繼承關(guān)系,那么既然string已經(jīng)封裝,但現(xiàn)在還可以為它增加方法,是不是違反了類的封裝性呢?不是!實際上,擴展方法無法訪問它們所擴展的類型中的私有變量,擴展方法對它們所擴展的類型中的所有所有成員相互之間無異常,所擴展的類型中的方法或?qū)傩允莗ublic的能訪問,是private還是不能訪問,不干擾,無影響。注意:a.如果擴展方法與該類型中定義的方法具有相同的簽名,則擴展方法永遠不會被調(diào)用。a.擴展方法被放在命名空
8、間級別放入范圍中。例如,如果您在同一個名為Extensions的命名空間中具有多個包含擴展方法的靜態(tài)類,則這些擴展方法將全部由usingExtensions;指令放入范圍中。一.匿名方法:1.先看一個例子:匿名方法就是dText=delegate(){Console.WriteLine("helloworld");};等號右邊的。說一下專業(yè)名詞:如果局部變量和參數(shù)的范圍包含匿名方法聲明,則該局部變量和參數(shù)稱為該匿名方法的“外部”變量2.匿名方法的定義就不多說了,注意:a.匿名方法的