1)擴展方法是什麼? 擴展方法可以在不修改原有類的代碼前提下,給類“增加”一個方法。擴展方法雖然屬於靜態方法,但調用的語法卻和對象調用類似。直接用一個例子來演示擴展方法。 1.準備實體類 public class Person { public Person(string name, int age ...
1)擴展方法是什麼?
擴展方法可以在不修改原有類的代碼前提下,給類“增加”一個方法。擴展方法雖然屬於靜態方法,但調用的語法卻和對象調用類似。直接用一個例子來演示擴展方法。
1.準備實體類
public class Person
{
public Person(string name, int age)
{
this.Name = name;
this.Age = age;
}
public int Age { get; set; }
public string Name { get; set; }
}
Person實體類代碼
2.準備一個靜態類和一個靜態方法
public static class MyTest
{
public static void SayHello(this Person per1, string flag)
{
Console.WriteLine("你好,我是{0},年齡{1},{2}", per1.Name, per1.Age, flag);
}
}
View Code
3.主函數代碼如下
class Program
{
static void Main(string[] args)
{
Person per1 = new Person("per1", 21);
per1.SayHello("握手");
Console.ReadKey();
}
}
View Code
在本次實驗里,MyTest靜態類里的SayHello()就是擴展方法。定義擴展方法的標準是:第一個參數類型是被擴展的類型,類型前面標註this。擴展方法其實也可以被當成普通的靜態方法使用,比如上面的主函數代碼修改成如下狀況也能正常使用,當然只是強調一下而已,既然已經寫成擴展方法,那最好還是當成擴展方法使用才方便:
class Program
{
static void Main(string[] args)
{
Person per1 = new Person("per1", 21);
MyTest.SayHello(per1, "握手");
Console.ReadKey();
}
}
View Code
2)為什麼使用擴展方法?
字面意思,就好像給一個類又增加了一個方法。在上面演示中,用Person對象去調用的SayHello()方法就好像是Person類內部的方法,然而這個方法卻屬於MyTest靜態類。或許會覺得很奇怪,為何不直接在Person類內部加一個public void SayHello(string flag)方法就完事。實際上擴展方法的好處在於,對於已經封裝好的類,不用再去修改類內部代碼便能完成對類擴充一個方法,這提高了對類的擴展性。比如在Winform窗體程式中,對於TextBox的一個對象,要去判斷Text屬性值是否為a123,直接寫一個擴展方法並讓這個對象去調用,部分代碼如下:
1.在窗體程式上增加一個TextBox文本框,一個Button按鈕
2.增加一個靜態類
static class Check
{
public static bool CheckTest(this TextBox txt1)
{
return txt1.Text == "a123";
}
}
View Code
3.給Button按鈕新建單擊事件,代碼如下
private void button1_Click(object sender, EventArgs e)
{
bool a = textBox1.CheckTest();
MessageBox.Show(a.ToString());
}
View Code
4.運行測試
在上面演示中,TextBox類是微軟已經封裝好的類,但卻可以做到在內部添加了一個CheckTest()方法的效果。
3)對於擴展方法的總結
1.擴展方法所在的類必須是靜態類,也就是被static修飾的類
2.擴展方法的第一個參數類型是被擴展的類型,類型前面標註this
3.使用擴展方法的代碼必須添加對擴展方法所在類的namespace的using
4.擴展方法最終其實還是被編譯器處理成普通靜態方法的調用了
5.擴展方法由於本質上還是靜態方法的調用,所以不能訪問類外部訪問不了的成員
6.該文章只是對擴展方法的初步理解,網上對於擴展方法的好印象更多來源於Linq的使用。但因為自己對擴展方法接觸還不太深,因此說聲抱歉。