一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

.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簡談委托鏈,轉載需保留來源!

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

主站蜘蛛池模板: 110139日韩欧美 | 天堂一区二区三区精品 | 91av久久| 日韩在线看片 | 欧美综合图片 | 欧美精品综合 | 国产观看精品一区二区三区 | 欧美精品亚洲精品日韩经典 | 亚洲国产99在线精品一区二区 | 美女视频黄视大全视频免费的 | 国产成人啪精品午夜在线播放 | 亚洲一片 | 国产精品国内免费一区二区三区 | 国产麻豆网 | 大学生一级毛片全黄真人 | 国产在线每日更新 | 亚洲不卡一区二区三区在线 | 综合伊人久久 | 国产女主播福利在线 | 自拍偷自拍亚洲精品被多人伦好爽 | 国产美女又黄又爽又色视频网站 | 国产精品久久自在自2021 | 国产麻豆精品一区 | 激情图片激情文学 | 91视频国产一区 | xxxxxbbbbb欧美性极品 | 成人黄视频在线观看 | 综合五月婷婷 | 高清国产欧美一v精品 | 美女免费精品高清毛片在线视 | 激情综合色 | 女人笫一次一级毛片 | 亚洲综合网在线 | 亚洲视屏一区 | 久久这里精品青草免费 | 一区二区三区四区视频在线 | 精品视频中文字幕 | 国产激情视频在线观看首页 | 99久久国产综合精品网成人影院 | 国产一区二区三区免费播放 | 国产成人精品自线拍 |