.NET Framework擴(kuò)展方法基本常識(shí)簡(jiǎn)介
.NET Framework中有很多新奇的東西值得我們?nèi)ド钊氲难芯俊_@個(gè)世界上總是存在著很多奇妙的東西。然而,在這部分所介紹的擴(kuò)展方法就是其中之一。從字面上看可能讀者很難猜透.NET Framework擴(kuò)展方法是什么意思。然而,看了下面的例子,就會(huì)感覺(jué)到非常的奇妙。#t#
- namespace ExtMethod
- {
- public class Class1
- {
- public String s = "bill";
- }
- public class Class2 : Class1
- {
- }
- public static class AnyClassName
- {
- public static String getName
(this Class1 class1) - {
- return class1.s + class1.s;
- }
- }
- public partial class Form1 : Form
- {
- private void button1_Click
(object sender, EventArgs e) - {
- Class1 c = new Class1();
- MessageBox.Show(c.getName());
- Class2 c = new Class2();
- MessageBox.Show(c.getName());
- }
- }
- }
看到上面的代碼,也許很多人會(huì)感到奇怪,在Class1和Class2中并沒(méi)有g(shù)etName方法,怎么在調(diào)用時(shí)出來(lái)個(gè)getName方法呢?實(shí)際上,這就是.NET Framework擴(kuò)展方法的用法,從本質(zhì)上說(shuō),擴(kuò)展方法就是將靜態(tài)方法(必須聲明成static)插入到某個(gè)類(lèi)和其子類(lèi)中(也就是說(shuō),在這些類(lèi)中可以使用在外部定義的靜態(tài)方法)。那么要往哪個(gè)類(lèi)中插入呢?這就要在定義靜態(tài)方法時(shí)指定了。大家可以看看getName方法的第一個(gè)參數(shù),使用了this關(guān)鍵字,這就表明這個(gè)方法是一個(gè)擴(kuò)展方法,后面的類(lèi)型就是要插入該方法的類(lèi),在本例中是Class1,也就是說(shuō)在Class1及其子類(lèi)中都可以使用getName方法。上面的調(diào)用代碼也相當(dāng)于下面的代碼:
- Class2 c = new Class2();
- MessageBox.Show(AnyClass
Name.getName(c));
但使用c.getName可能會(huì)更好一些,而且也降低了對(duì)靜態(tài)方法所在的類(lèi)(AnyClassName)的依賴(lài)性。
在使用.NET Framework擴(kuò)展方法時(shí)應(yīng)注意以下幾點(diǎn):
1. 擴(kuò)展方法所在的類(lèi)名可以是任意合法的類(lèi)名。
2. 擴(kuò)展方法所在的類(lèi)必須和使用擴(kuò)展方法的代碼在同一個(gè)命名空間里,否則無(wú)法編譯通過(guò)。
3. 在本例中,Class1和Class2只能聲明成public,因?yàn)锳nyClassName被聲明為public。如果AnyClassName不加修飾符,Class1和Class2也可以不加修飾符,當(dāng)然,也可以被聲明為public。也就是說(shuō),Class1和Class2必須有比AnyClassName具有更強(qiáng)的訪(fǎng)問(wèn)性。如下面代碼所示:
- class Class1
- {
- public String s = "bill";
- }
- class Class2 : Class1
- {
- }
- static class AnyClassName
- // 這時(shí)如果前面加public是無(wú)法編
譯通過(guò)的。- {
- public static String getName
(this Class1 class1)- {
- return class1.s + class1.s;
- }
- }
4. 如果在Class1或Class2中已經(jīng)有g(shù)etName方法了,那么Class1或Class2中的getName優(yōu)先級(jí)更高。也就是說(shuō),擴(kuò)展方法是無(wú)法覆蓋原類(lèi)中的同名(參數(shù)名和類(lèi)型也相同)的方法的。
.NET Framework擴(kuò)展方法尤其在很多類(lèi)需要同樣的方法,而這些類(lèi)又無(wú)法繼承其它類(lèi)時(shí)特別有用。當(dāng)然,在要對(duì)某個(gè)類(lèi)進(jìn)行擴(kuò)展,但我們并沒(méi)有源代碼時(shí),擴(kuò)展方法也可以派上用場(chǎng)。