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

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

主站蜘蛛池模板: 99国产精品欲AV蜜桃臀麻豆 | 色综合 亚洲 自拍 欧洲 | 亚洲电影成人 成人影院 | 男人私gay挠脚心vk视频 | 国产精品一区二区四区 | 父亲在线日本综艺免费观看全集 | 午夜理论片日本中文在线 | 中文字幕一区二区三区在线观看 | 黄色大片久久 | 91精品免费久久久久久久久 | 亚洲av欧美在我 | 亚洲福利精品电影在线观看 | 理论片午午伦夜理片影院 | 99精品久久精品一区二区 | 久久学生精品国产自在拍 | 日韩熟女精品一区二区三区 | 日韩欧美高清一区 | 中文字幕亚洲综合小综合在线 | 日本无卡无吗在线 | 国产AV白丝爆浆在线播放 | 欧洲精品不卡1卡2卡三卡四卡 | 艺术片 快播 | 动漫美女禁区 | GOGOGO高清免费播放 | 日韩精品熟女一区二区三区中文 | caoporn 超碰在线视频 | 伦理片天堂eeuss影院2o12 | 久久久久久久久亚洲 | 日美欧韩一区二去三区 | 月夜直播视频免费观看 | 99亚偷拍自图区亚洲 | H厨房灌草莓 | 纯肉巨黄H爆粗口男男分卷阅读 | 亚洲欧美综合中文字幕 | 第一次玩老妇真实经历 | 97蜜桃123 | 亚洲精品线在线观看 | 欧美男男网站免费观看videos | 748亚洲大胆国模人体 | 99精品电影一区二区免费看 | 最近免费中文MV在线字幕 |