四擴展方法
這個世界上總是存在著很多奇妙的東西然而在這部分所介紹的擴展方法就是其中之一從字面上看可能讀者很難猜透擴展方法是什麼意思然而看了下面的例子就會感覺到非常的奇妙
namespace ExtMethod{public class Class
{public String s =
bill
;}public class Class
: Class
{}public static class AnyClassName{public static String getName(this Class
class
){return class
s + class
s; }}public partial class Form
: Form{private void button
_Click(object sender
EventArgs e){Class
c = new Class
();MessageBox
Show(c
getName()); Class
c = new Class
();MessageBox
Show(c
getName()); }}}
看到上面的代碼也許很多人會感到奇怪在Class和Class中並沒有getName方法怎麼在調用時出來個getName方法呢?實際上這就是擴展方法的用法從本質上說擴展方法就是將靜態方法(必須聲明成static)插入到某個類和其子類中(也就是說在這些類中可以使用在外部定義的靜態方法)那麼要往哪個類中插入呢?這就要在定義靜態方法時指定了大家可以看看getName方法的第一個參數使用了this關鍵字這就表明這個方法是一個擴展方法後面的類型就是要插入該方法的類在本例中是Class也就是說在Class及其子類中都可以使用getName方法上面的調用代碼也相當於下面的代碼
Class
c = new Class
();
MessageBox
Show(AnyClassName
getName(c));
但使用cgetName可能會更好一些而且也降低了對靜態方法所在的類(AnyClassName)的依賴性
在使用擴展方法時應注意以下幾點
擴展方法所在的類名可以是任意合法的類名
擴展方法所在的類必須和使用擴展方法的代碼在同一個命名空間裡否則無法編譯通過
在本例中Class和Class只能聲明成public因為AnyClassName被聲明為public如果AnyClassName不加修飾符Class和Class也可以不加修飾符當然也可以被聲明為public也就是說Class和Class必須有比AnyClassName具有更強的訪問性如下面代碼所示
class Class
{public String s =
bill
;}class Class
: Class
{}static class AnyClassName // 這時如果前面加public是無法編譯通過的
{public static String getName(this Class
class
){return class
s + class
s; }}
如果在Class或Class中已經有getName方法了那麼Class或Class中的getName優先級更高也就是說擴展方法是無法覆蓋原類中的同名(參數名和類型也相同)的方法的
擴展方法尤其在很多類需要同樣的方法而這些類又無法繼承其它類時特別有用當然在要對某個類進行擴展但我們並沒有源代碼時擴展方法也可以派上用場
[] [] []
From:http://tw.wingwit.com/Article/program/net/201311/15230.html