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

.NET簡談委托鏈

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

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

圖1:

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

 

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

NET技術(shù).NET簡談委托鏈,轉(zhuǎn)載需保留來源!

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

主站蜘蛛池模板: 鸭子玩富婆流白浆视频 | 欧美特级特黄a大片免费 | 99精品国产高清自在线看超 | FREE17一18外女破 | 99热久久久无码国产精品性麻豆 | 97影院理论午夜伦不卡偷 | AV亚洲精品少妇毛片无码 | 欧美午夜免费观看福利片 | 亚洲电影网址 | 免费看欧美xxx片 | 国产日韩精品一区二区在线观看 | 成人免费视频一区 | 2022年国产精品久久久久 | 大陆午夜伦理 | 欧美黑人经典片免费观看 | 一本道色综合手机久久 | 99热久久视频只有精品6 | 亚洲人成电影网站在线观看 | 视频一区二区中文字幕 | 伊人久久艹 | BL全肉多攻NP高H | 内射少妇三洞齐开 | 果冻传媒在线播放 免费观看 | 国产精品香蕉视频在线 | 蜜臀AV精品久久无码99 | 亚洲无吗在线视频 | 999久久久无码国产精蜜柚 | 成人免费无毒在线观看网站 | 无码AV精品一区二区三区 | 少妇连续高潮抽搐痉挛昏厥 | 医生含着我的奶边摸边做 | 国产成人免费 | 婷婷五月久久精品国产亚洲 | 亚洲一区高清 | 男人的天堂久久精品激情a 男人的天堂黄色片 | 午夜久久影院 | 99国产视频 | 国产成在线观看免费视频 | 我的好妈妈BD免费观看 | 精品一成人岛国片在线观看 | 人妻换人妻AA视频 |