中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

如何解析.NET中容易混淆的委托與接口

如何解析.NET中容易混淆的委托與接口,很多新手對此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

專注于為中小企業(yè)提供做網(wǎng)站、成都做網(wǎng)站服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)岫巖免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上1000家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

昨天在和一位朋友討論到委托接口的問題,一開始我覺得很不可思議,這兩個(gè)東西的概念怎么會混淆呢?要混淆也是接口和抽象類,委托和事件相混淆啊!但是著我的一個(gè)例子我馬上意識到很有可能因?yàn)槲覍⒁憩F(xiàn)的這個(gè)例子,讓很多朋友混淆了委托與接口的用途.所以我想通過這篇文章試圖說明白委托和接口的概念和用途,其實(shí)他們倆的差別還是很大的.

委托:

委托是一種定義方法簽名的類型。當(dāng)實(shí)例化委托時(shí),您可以將其實(shí)例與任何具有兼容簽名的方法相關(guān)聯(lián)。您可以通過委托實(shí)例調(diào)用方法。

委托用于將方法作為參數(shù)傳遞給其他方法。事件處理程序就是通過委托調(diào)用的方法。您可以創(chuàng)建一個(gè)自定義方法,當(dāng)發(fā)生特定事件時(shí)某個(gè)類(例如 Windows 控件)就可以調(diào)用您的方法.

委托具有以下特點(diǎn):

委托類似于 C++ 函數(shù)指針,但它們是類型安全的。

委托允許將方法作為參數(shù)進(jìn)行傳遞。

委托可用于定義回調(diào)方法。

委托可以鏈接在一起;例如,可以對一個(gè)事件調(diào)用多個(gè)方法。

方法不必與委托簽名完全匹配。有關(guān)更多信息,請參見在委托中使用變體(C# 和 Visual Basic)。

C# 2.0 版引入了匿名方法的概念,此類方法允許將代碼塊作為參數(shù)傳遞,以代替單獨(dú)定義的方法。C# 3.0 引入了 Lambda 表達(dá)式,利用它們可以更簡練地編寫內(nèi)聯(lián)代碼塊。匿名方法和 Lambda 表達(dá)式(在某些上下文中)都可編譯為委托類型。這些功能統(tǒng)稱為匿名函數(shù)。有關(guān) Lambda 表達(dá)式的更多信息,請參見Anonymous Functions (C# Programming Guide)。

接口:

接口描述的是可屬于任何類或結(jié)構(gòu)的一組相關(guān)功能。接口可由方法、屬性、事件、索引器或這四種成員類型的任意組合構(gòu)成。接口不能包含字段。接口成員一定是公共的。

當(dāng)類或結(jié)構(gòu)繼承接口時(shí),意味著該類或結(jié)構(gòu)為該接口定義的所有成員提供實(shí)現(xiàn)。接口本身不提供類或結(jié)構(gòu)能夠以繼承基類功能的方式繼承的任何功能。但是,如果基類實(shí)現(xiàn)接口,派生類將繼承該實(shí)現(xiàn)。

類和結(jié)構(gòu)可以按照類繼承基類或結(jié)構(gòu)的類似方式繼承接口,但有兩個(gè)例外:

類或結(jié)構(gòu)可繼承多個(gè)接口。

類或結(jié)構(gòu)繼承接口時(shí),僅繼承方法名稱和簽名,因?yàn)榻涌诒旧聿话瑢?shí)現(xiàn)。

接口具有下列屬性:

接口類似于抽象基類:繼承接口的任何非抽象類型都必須實(shí)現(xiàn)接口的所有成員。

不能直接實(shí)例化接口。

接口可以包含事件、索引器、方法和屬性。

接口不包含方法的實(shí)現(xiàn)。

類和結(jié)構(gòu)可從多個(gè)接口繼承。

接口自身可從多個(gè)接口繼承。

正文開始

在寫這些文字的時(shí)候我又將以上的各個(gè)概念熟悉了一遍,以防自己把自己忽悠混淆了.所以不適合群眾請盡快退散.另外如果您看完上面的定義和特征后就從兩者的混淆中走了出來,您也可以嘗試?yán)^續(xù)往下看.

首先,關(guān)于委托的用法,我們可以這樣使用:

以下是代碼片段:

public int Calculate(Func del) { int a = 1, b = 2; return del(a, b); }

我們可以通過傳不同的Func來改變整個(gè)方法的結(jié)果.

以下是代碼片段:

public int Add(int a, int b)   { return a + b; }   public int Sub(int a, int b)   { return a - b; }   //調(diào)用方法如下   public void TestMethod()   { int result = Calculate(Add);  //the result is 3 int anotherResult = Calculate(Sub);  //the result is -1   }

首先我在Calculate方法中已經(jīng)確定了2個(gè)數(shù)的值,并且包括在該方法當(dāng)中.在輸出結(jié)果的時(shí)候能明顯看出傳遞的委托不同,其結(jié)果也不同.我們使用委托來改變方法的執(zhí)行內(nèi)容,我們不但可以改變其方法的內(nèi)容,也可以在執(zhí)行該方法的時(shí)候順便做點(diǎn)什么(比如說做個(gè)日志記錄).

噢,可能您覺得二者容易混淆的地方在于..我還是舉個(gè)例子比較好解釋.

以下是代碼片段:

public interface ICal   { int Calculate(int a, int b); }   //有多個(gè)類實(shí)現(xiàn)了ICal接口.   public class Add : ICal   { public int Calculate(int a, int b)   { return a + b; } } public class Sub : ICal   { public int Calculate(int a, int b)   { return a - b; } }   //然后通過調(diào)用不同類來獲取不同的方法   public static void Main()   {   ICal cal = new Add();   //ICal=new Sub();   Console.Write(cal.Calculate(1, 2));   }

講解一下,通過上面的例子我們可以知道在創(chuàng)建一個(gè)具有計(jì)算功能(Calculate)的接口ICal之后,產(chǎn)生了兩個(gè)具有計(jì)算功能的具體類,分別是Add和Sub.為了要獲得結(jié)果,我們創(chuàng)建了一個(gè)需要有計(jì)算功能的”坑”,并賦予能與此”坑”相匹配的類Add(或Sub),***從該坑中調(diào)用Calculate的結(jié)果就行.

貌似說的過去?好,那么我至少要讓你覺得有個(gè)適用范圍吧!看下面的例子.

比如有個(gè)Person類的數(shù)組arr.這時(shí)候我們可以通過委托的方法實(shí)現(xiàn)arr的排序.可是系統(tǒng)怎么知道2個(gè)Person哪個(gè)排在前面,哪個(gè)該排在后面?這時(shí)候我們就可以傳進(jìn)一個(gè)委托來告訴系統(tǒng)Peron類的大小.

以下是代碼片段:

arr.Sort(p => { p.ID });

該lambda表達(dá)式意思是丟給該Sort方法一個(gè)排序的Key(此key能夠進(jìn)行大小比較),那么Sort就可以根據(jù)此key來進(jìn)行比較.那通過接口呢?首先得創(chuàng)建一個(gè)繼承自IComparer的類,我就拿本身繼承它吧.

好吧,它本來是很麻煩的:

以下是代碼片段:

private int SortDelegate(Person p)   { return p.ID; }   public void TestMethod()   { arr.Sort(new Func(SortDelegate));   }

但是我們要承認(rèn)C# 3.0帶給我們的便利.

現(xiàn)在,我們要讓Person類實(shí)現(xiàn)接口的規(guī)定.

以下是代碼片段:

public int Compare(Person x, Person y)     {     //假設(shè)person的ID是int類型     return x.ID - y.ID;     }

那么我們的實(shí)現(xiàn)方法就可能是這樣:

以下是代碼片段:

arr.Sort((new Person() as IComparer) comp);

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。

標(biāo)題名稱:如何解析.NET中容易混淆的委托與接口
標(biāo)題網(wǎng)址:http://www.rwnh.cn/article28/gcgpcp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、定制開發(fā)企業(yè)建站、網(wǎng)站營銷、關(guān)鍵詞優(yōu)化、手機(jī)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
怀远县| 全州县| 武邑县| 巢湖市| 临江市| 屯门区| 宝山区| 偃师市| 孟津县| 林芝县| 界首市| 梨树县| 临邑县| 礼泉县| 洛宁县| 怀宁县| 台湾省| 娱乐| 伊春市| 晋江市| 张北县| 宜宾县| 武鸣县| 永泰县| 陵川县| 许昌县| 康马县| 全州县| 开江县| 茶陵县| 乐平市| 石嘴山市| 东方市| 集安市| 县级市| 虎林市| 徐水县| 启东市| 叶城县| 南岸区| 武隆县|