天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

.NET簡談委托鏈

  說起鏈表大家都很熟悉,說起委托相信大部分的.NET程序員都也很了解。在平時的開發過程中經常會用到這兩種技術,只不過鏈表在.NET里面已經被封裝了,讓我們用起來更加的方便就是集合類型Collection。在某些時候我們有必要要了解這些方便而又快捷的背后是怎樣封裝的,委托是一種特殊的類型,在.NET里面是用來作為方法的一種封裝。在一些非托管的代碼中如C++就沒有這么幸運了,我們要面對是一些復雜的地址變換、鏈表的指針維護、內存的取址等等。微軟一向都是人性化模仿的對象,不管是他的操作系統還是開發平臺IDE做的都很舒服。可能有的人會說把程序員這么崇高而又神秘的職業該大眾化了,是人都會寫程序。這種問題大家仁者見仁,智者見智了。

  今天我要說的就是.NET中的委托鏈,也許這個技術名詞見的人很少,但是概念大家都能從字面上理解出來,那就是委托與鏈表的關系。簡單點就是委托通過鏈表的方式將其保存,然后依次調用,關于委托與事件的可以參照本人的“委托與事件”文章。委托是指向方法的指針,將方法以對象的方式包裝起來,方便、安全、異步的調用,在異步方面都是CLR通過后臺線程去處理,我們不需要關心一些線程調度互斥等問題,特殊情況下也需要我們自己去從頭封裝。委托是一種類型,通過實例化多個委托實例去封裝要調用的方法,在程序運行過程中每一個方法是被壓入棧的數據結構中的,在調用之前先要確定方法的地址,所有通過引用類型將方法獨立出來,方便尋找和調用。當多個委托實例聚集在一起的時候就形成了委托鏈這么一個數據結構,比如在我們經常使用的Button中一個Click事件,我們會通過:Button.Click+=New 委托類型(方法1)將一個委托實例加入到委托鏈表中去,我繼續添加一個方法到鏈表中去Button.Click+=New 委托類型(方法2),這個時候在委托鏈表中就有了兩個委托實例了,也就是兩個方法的調用。鏈表是有順序的,方法2在方法1后面,代碼的調用順序就是先調用方法1,然后將處理結果再帶入到方法2中,處理依次進行,這樣就形成了對委托鏈的整體調用。在使用時有一些細節需要注意也是性能的問題,“代碼永遠是危害程序性能的罪魁禍首”,在上述代碼中Btton.Click+=New 委托類型(方法1),可以寫成Button.Click+=方法1,這樣就減少了一個委托實例的內存分配,系統將使用順序表保存調用的方法,而不是鏈表,鏈表和順序表在性能的區別我想學過《數據結構》的人都知道。當不需要使用鏈表中的某個方法時,可以通過委托移除表達式將方法從委托鏈表中移除,Button.Click-=方法1,我已經將方法1從委托鏈表中移除,當下次調用時,代碼是不會走到方法1中的,在我們開發過程中經常會遇到這樣的情況:一個事件發生了我要調用N個方法,但是我并不能控制這種執行順序,這個時候我們就可以將方法從鏈表中移除或者添加,很方便的控制委托鏈中的方法執行前后順序。也會遇到這種情況,我有十個方法用來處理程序的邏輯,但是這十個方法不是死的,我需要根據不同的條件,從這十個方法中動態跳轉到其他的邏輯處理中,然后再回到該方法,程序永遠不會脫離這十個方法,這個時候我們就需要用到委托參數了,這個時候我們需要定義一種類型用來在委托鏈表中傳遞,方法通過判斷這個類型的實例的狀態,確定是否繼續向下傳遞;

圖1:

 這個委托鏈中有4個方法,當我執行到方法2的時候我需要判斷用戶的輸入是否正確,是否讓后面的方法在繼續執行:

 

public class Class1
{
/// <summary>
/// 委托類型
/// </summary>
/// <param name="ismove">是否向下執行的標識</param>
public delegate void Print(ref string ismove);
/// <summary>
/// 委托實例
/// </summary>
Print p;
/// <summary>
///默認構造函數
/// </summary>
public Class1()
{
//添加四個方法
Print p = new Print(method1);//第一個方法用來實例化委托第一個實例
p += method2;
p
+= method3;
p
+= method4;
}
/// <summary>
/// 開始執行委托鏈
/// </summary>
/// <returns></returns>
public string run()
{
string ismove = "yes";
p(
ref ismove);
return ismove;
}
public void method1(ref string ismove)
{
if (ismove == "yes")//判斷是否要繼續向下執行
{
}
}
public void method2(ref string ismove)
{
if (ismove == "yes")//判斷是否要繼續向下執行
{
//我這里執行出了問題,不想繼續向下執行了
ismove = "no";//后面的所有方法都不會執行
}
}
public void method3(ref string ismove)
{
if (ismove == "yes")//判斷是否要繼續向下執行
{
}
}
public void method4(ref string ismove)
{
if (ismove == "yes")//判斷是否要繼續向下執行
{
}
}
}

NET技術.NET簡談委托鏈,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 寂寞夜晚在线视频观看 | 热久久伊大人香蕉网老师 | 国产精品人妻午夜福利 | 亚洲 自拍 偷拍 另类综合图区 | 男子扒开美女尿口做羞羞的事 | 十大禁止安装的黄台有风险 | 性xxx免费视频 | 人妻中文字幕无码久久AV爆 | 久久精品国产欧美成人 | 日日AV夜夜添久久奶无码 | 亚洲免费在线视频观看 | 考试考90就可以晚上和老师C | 亚洲AV午夜精品麻豆AV | 外女思春台湾三级 | 久久精品国产色蜜蜜麻豆国语版 | 狠狠色综合久久婷婷 | 毛片免费播放 | 日韩欧美中文字幕一区 | 十分钟免费观看大全视频 | 性满足久久久久久久久 | 国产精品久久久久久久久齐齐 | 亚洲国产中文字幕在线视频综合 | 美女被j进去动态 | 亚洲欧美中文字幕网站大全 | 三级黄色高清视频 | yellow视频免费观看高清在线 | 视频一区二区中文字幕 | av影音先锋天堂网 | 抽插妇女疯狂视频 | 免费精品美女久久久久久久久 | 久久伊人男人的天堂网站 | 久久国产高清字幕中文 | 亚洲色欲H网在线观看 | 视频网站入口在线看 | 一点色成人 | 日本中文字幕巨大的乳专区 | 亚洲91av| 99久久就热视频精品草 | 精品人妻伦一二三区久久AAA片 | 国产成人高清亚洲一区app | 健身房被教练啪到腿软H |