C#委託本質探索 1、初試委託
// 初聽委託,看字面的意思,我理解成:一我的委託另外一我的作某件事.
// 按照這個想法,設計了下面這個測試程序
// 領導委託下屬作某件事.
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
namespace ConsoleApplication1
{
public class FirstTest
{
public static void 測試()
{
領導 朱哥 = new 領導();
朱哥.下達任務();
}
}
delegate string 委託任務(string 任務內容);
class 領導
{
下屬 小薇 = new 下屬();
public void 下達任務()
{
string 執行結果;
委託任務 一個委託任務;
一個委託任務 = new 委託任務(小薇.本職工做);
//一個委託任務 = 小薇.本職工做;
執行結果 = 一個委託任務("運營魔獸世界");
Console.WriteLine(執行結果);
執行結果 = 一個委託任務("處理業內競爭");
Console.WriteLine(執行結果);
//這樣不是更直接
執行結果 = 小薇.本職工做("運營魔獸世界");
Console.WriteLine(執行結果);
執行結果 = 小薇.本職工做("處理業內競爭");
Console.WriteLine(執行結果);
//來點邪性的,用Type.InvokeMember
object 某下屬 = typeof(下屬).InvokeMember(null, BindingFlags.CreateInstance, null, null, null);
執行結果 = (string)typeof(下屬).InvokeMember("本職工做", BindingFlags.InvokeMethod, null, 某下屬, new object[] { "運營魔獸世界" });
Console.WriteLine(執行結果);
}
}
class 下屬
{
public string 本職工做(string 任務內容)
{
StringBuilder 工做內容 = new StringBuilder();
if (任務內容 == "運營魔獸世界")
{
工做內容.AppendLine("安排設備採購");
工做內容.AppendLine("招募客服,上崗培訓");
工做內容.AppendLine("廣告宣傳");
工做內容.AppendLine("遊戲上市");
工做內容.AppendLine("推出活動");
工做內容.AppendLine("…………");
}
else if (任務內容 == "處理業內競爭")
{
工做內容.AppendLine("調查競爭對手");
工做內容.AppendLine("展開鬥爭");
}
return 工做內容.ToString();
}
}
// 從這個例子能夠看出來,委託別人作某件事能夠有不少種方法,而用委託技術是最扯淡的.
// 這可否說明,我對委託技術的理解進入了一個誤區.委託技術根本不是這樣用的.
// 從編程角度講,委託技術絕對不是爲了實現一個類讓另外一個類執行某個方法而誕生的技術.
// 想實現那樣的功能,只須要實例化另外一個類,調用實例的方法就實現目的了.
// 委託技術的本質是什麼?
// 觀察定義語句 delegate string 委託任務(string 任務內容);
// 從級別上看delegate與class是同級的.
// 若是把後面的 string 委託任務(string 任務內容)當作一個對象的實體
// delegate 是否是能夠理解成class這樣的對象定義符?
// 而這個定義符專門就是用來定義一個方法用的.
// 繼續觀察,"委託任務"的實例化過程
// 一個委託任務 = new 委託任務(小薇.本職工做);
// 仔細分析:
// 首先,在"一個委託任務"被實例化前,"下屬"類已然被實例化.
// "小薇.本職工做"是一個地址指針,指向"下屬"類的實例"小薇"的方法"本職工做".
// "小薇.本職工做"指針遵循"委託任務"類的結構,實例化爲一個新的方法指針,並賦值給"一個委託任務"變量.
// 這個賦值過程能夠變成這樣: 一個委託任務 = 小薇.本職工做;
// 對比類的實例化過程 MyClass aClass = new MyClass(Type instance);
// delegate定義的類型的構造函數須要傳入方法實例參數,參數類型爲delegate定義的類型.
// 回頭再看類型定義部分 delegate string 委託任務(string 任務內容);
// 這裏只有一行聲明,沒有內容,很抽象.沒錯,這不就是個沒有內容的抽象類定義嘛!
// 總結,delegate本質就是:一個抽象方法的類型定義,實例化抽象方法時須要傳入實例指針.
// 委託這個詞遠離我,我有語義依賴,看到委託這個詞頭暈.顧名思義!看到委託這個詞我明不了在.NET裏的意.
// 爲何delegate定義和實例化時表現與class存在區別,先無論他,那是更深層事.總之是這樣的一個用法.
// *參照string實際上是System.String的轉義,delegate同樣using delegate = System.Delegate;
// *System.Delegate先不研究,準備研究他的用法.
}
// 測試代碼
FirstTest.測試();web