從星期一,一直無聊到今天,老闆都沒安排我事做,但是他們都忙得要死。
星期二的時候,看了幾篇心理學的文章。裡面說,人不知道在做什麼的時候,有兩種選擇:1,什麼都不做。2,去做點什麼。 於是我昨天嘗試著什麼都不做,上上網,看看非技術書籍的書。結果發現,下午的時候,人就眼花了,然後腦袋一片空白,晚上回去,感覺精神有點恍惚,並且一直眼花。 今天早上,第一個想法,去做點什麼。無聊翻開asp.net mvc,想學習學習看看別人怎麼設計東西的。然後就看到一段代碼, public static void EndForm(this HtmlHelper htmlHelper) 這個方法的類是在 System.Web.Mvc.Html.FormExtensions 裡的。一時看到這個 this,不知道有何用意?開始絞盡腦汁回想我那屁大專教育讓我學的N門程式設計語言,裡面是否有這個語言細節,還是沒回想起來。於是乎開始 google,找了半年,就找到C# 函數參數類型名稱前的就是 ref params out,三個修飾符。沒有發現 this 的作用,於是乎,我又試著把這個 this 去掉,看會不會報錯。結果編譯通過。 偶然看到一位兄台的一篇文章,他回答的問題跟我的疑問風馬牛不相及,但是他提供了一個方法,自己寫點代碼,自己去試一試,從頭到尾的看看具體有什麼不同。 於是乎,我寫了兩個的類public class TestClass
{
public string MyName
{
get;
set;
}
public TestClass()
{
//
//TODO: 在此處添加建構函式邏輯
//
}
public static string GetDefault()
{
return "he";
}
} public static class StaticClass{
public static void Show(this TestClass test)
{
HttpContext.Current.Response.Write(test.MyName);
}
} 我的想法,是不是要這個 this, 才可以在靜態方法中調用這個 TestClass 中的資料。結果去掉 this,測試一下CodeCode protected void Page_Load(object sender, EventArgs e) {
TestClass test = new TestClass();
test.MyName = "me";
StaticClass.Show(test);
} 毫無問題,顯示 "me"。去掉Show 裡面的 this 也沒有問題。於是我想想,是不是對方法的訪問會產生什麼影響, 我增加了一個方法,就在增加一個方法的時候,出現了的東西, 觀察發現,這個外部類可以調用 這個靜態類裡面的兩個靜態方法,不是說靜態類沒有 this 指標嗎?但是如果真的可以這樣 調用,那麼就可以為 TestClass 在不改變他原始碼的基礎上去增加一個方法。我再在 asp.net mvc 裡面去尋找 public static MvcForm BeginForm 的所有引用,發現沒有任何函數調用他。而 StaticClass 中的 Show方法,尋找所有引用,卻可以找到他的調用對象。這是 為什麼呢?為什麼寫這個 BeginForm 沒人調用? Ms 的技術人員吃飽了沒事寫個方法做擺設? 此時,仔細這個命名空間 System.Web.Mvc.Html.Extension , 關鍵字在 Extension. 一下答案和現象串聯了起來。可以為 一個類在不改變原始碼的情況下增加一個方法,不就是為了擴充方法的嗎????由此總結,這種 public static void 方法名(this 類 ) 是為了擴充某個類的方法而使用的一種技巧,非常神奇,原來那個類,都不用自己主動為自己寫方法,調用時便可以獲得一個別 人幫你寫好的一個方法。 看來搜關鍵字,應該是為 “程式後續版本擴充” 或者 “為程式擴充方法”,而我先搜的卻是 “方法名參數標識符”, “為什麼方法參數中會有 this ”,這就是現象和本質的區別。 結案! 甚矣,吾之不慧!