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