亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

c# 委托詳解

2019-10-29 21:14:11
字體:
來源:轉載
供稿:網友

委托是一個類型。C#中的委托是面向對象的,并且它是類型安全的 當創建委托實例的時候,創建的實例會包含一個調用列表,在調用列表中可以包含多個方法。每個方法稱作一個調用實體。調用實體可以是靜態方法,也可以是實例方法。如果是實例方法,則該調用實體包含調用該實例方法的實例。委托并不關心它所調用方法所屬的類,它只關心被調用方法與委托的類型是否兼容。 下面是代碼實例:

using System;namespace LycheeTest{ public delegate void D(int a, int b); public class Test { public D myDelegate; public Test() {  myDelegate = new D(Show1); } private static void Show1(int a, int b) {  Console.WriteLine("方法 Show1 被調用,兩個實參相加的值是:{0}", a + b); } private void Show2(int a, int b) {  Console.WriteLine("方法 Show2 被調用,兩個實參相加的值是:{0}", a + b); } private void Show3(int a, int b) {  Console.WriteLine("方法 Show3 被調用,兩個實參相加的值是:{0}", a + b); } } public class Program { static void Main(string[] args) {  Test myT = new Test();  myT.myDelegate(33, 22);  Console.ReadKey(); } }}

這段代碼演示的是最簡單的一種委托形式。委托類型可以定義在類的外部,也可以定義在類的內部。 本段代碼是定義在類的外部。第 3 行代碼定義的就是一個委托類型,委托類型的關鍵字是 delegate,關鍵字前是委托類型的訪問權限修飾符。關鍵字后是委托類型的返回類型,這個返回類型規定與委托類型兼容 的方法的返回類型必須與之相同。返回類型之后是委托類型的名稱。接下來是形參列表,它指定與委托類 型兼容的方法的參數類型和個數必須與之相同。第 5 行代碼定義了一個委托類型的變量,它是一個實例字段,訪問權限是 public 的。注意委托類型字段的訪問權限一定要比委托類型的訪問權限低或與委托類型的訪問權限相同才可以。第 9 行、第 12 行和第 15 行代碼定義了三個方法。其中第 9 行代碼是一個靜態方法。因為這段代碼演示的是最簡單的委托使用方法,所以只使用了其中的靜態方法。在第 6 行的構造方法中,實例化了委托類型的變量,注意為委托變量的調用列表添加方法,只需要向其構造方法中傳遞方法名稱即可。這是為委托添加調用方法的最基本的一種方法。第 21 行定義了 Test 類的一個實例,然后第 22 行調用了類的委托成員。在調用委托成員的時候,需要向其形參列表傳遞實參。這就是最基本的委托的使用方法。這段代碼的執行結果如下:

方法 Show1 被調用,兩個實參相加的值是:55

下面再介紹一種委托類型的使用方法,實例代碼如下:

using System;namespace LycheeTest { public delegate void D(int a, int b); public class Test { public static void Show1(int a, int b) {  Console.WriteLine("方法 Show1 被調用,兩個實參相加的值是:{0}", a + b); } public void Show2(int a, int b) {  Console.WriteLine("方法 Show2 被調用,兩個實參相加的值是:{0}", a + b); } public void Show3(int a, int b) {  Console.WriteLine("方法 Show3 被調用,兩個實參相加的值是:{0}", a + b); } } public class Program { static void Main(string[] args) {  Test myT = new Test();  D myDelegate = new D(Test.Show1);  D myDelegate1 = new D(myT.Show2);  D myDelegate2 = new D(myT.Show3);  myDelegate(22, 33);  myDelegate1(33, 44);  myDelegate2(55, 66);  Console.ReadKey(); } }}

這段代碼取消了類中的委托類型字段,而是將委托類型作為一個類來看待。在包含入口點方法的類中,首先第 17 行定義了 Test 類的一個變量并做了實例化。因為要向委托傳遞類的實例方法,所以必須有類的實 例存在,才能引用類的實例方法。第 18 行定義了一個委托類型的變量,并實例化,這里需要注意,因為委托并不是類中的一個成員了, 所以向其構造方法傳遞靜態方法的時候,需要以類名引用。第 19 行也定義了一個委托類型的變量,在向其傳遞實例方法的時候,需要以類的實例來引用。第 20 行代碼的情況同第 19 行代碼一樣。在向委托傳遞方法的時候,需要傳遞方法名,而不需要方法的形參列表。第 21 行到第 23 行是對委托的調用,這時要為其傳遞方法的實參。這段代碼的執行結果如下:

方法 Show1 被調用,兩個實參相加的值是:55 方法 Show2 被調用,兩個實參相加的值是:77 方法 Show3 被調用,兩個實參相加的值是:121

委托的訪問修飾符

當委托位于類的外部時,可以使用的訪問修飾符包括 public 和 internal。如果什么也不寫,默認是internal 的。當委托位于類的內部時,可以使用的訪問修飾符包括 public、protected、internal、protected

using System;namespace LycheeTest{ public class Test { protected delegate void D(int a, int b); private delegate void D1(int a, int b); protected internal delegate void D2(int a, int b); internal delegate void D3(int a, int b); private D myD; private D1 myD1; private D2 myD2; private D3 myD3; public Test() {  myD = new D(Show1);  myD1 = new D1(Show1);  myD2 = new D2(Show1);  myD3 = new D3(Show1); } public static void Show1(int a, int b) {  Console.WriteLine("方法 Show1 被調用,兩個實參相加的值是:{0}", a + b); } public void Show2(int a, int b) {  Console.WriteLine("方法 Show2 被調用,兩個實參相加的值是:{0}", a + b); } public void Show3(int a, int b) {  Console.WriteLine("方法 Show3 被調用,兩個實參相加的值是:{0}", a + b); } public void Use() {  myD(11, 12);  myD1(22, 45);  myD2(55, 78);  myD3(345, 100); } } class Test1: Test { private D Test1D; private D2 Test1D2; private D3 Test1D3; public Test1() {  Test1D = new D(Test.Show1);  Test1D2 = new D2(Test.Show1);  Test1D3 = new D3(Test.Show1); } public void Use1() {  Test1D(22, 45);  Test1D2(44, 45);  Test1D3(77, 78); } } public class Program { static void Main(string[] args) {  Test1 myT1 = new Test1();  myT1.Use();  myT1.Use1();  Console.ReadKey(); } }}

代碼的第 4 行在類的內部定義了委托類型,它作為類的成員定義,訪問權限是 protected,它可以被本類內部訪問,也可以被派生類訪問。代碼的第 5 行定義的委托類型,訪問權限是 private 的,它只可以被本類內部訪問。代碼的第 6 行定義的 protected internal 訪問權限的委托類型,可以被本程序集訪問, 還可以被派生類訪問,而不管派生類位于哪個程序集。第 7 行定義的委托類型是 internal 的,它只可以被本程序集訪問。因為所有這幾種委托類型都可以被本類內部訪問,所以第 10 行到第 13 行定義了它們的變量。第 12 行的實例構造方法中,對這四個委托類型的變量進行了實例化,并為它們的調用列表加入了方法 Show1。Show1 是一個靜態方法,但是在類內部傳入委托類型的構造方法時,不需要使用類名引用。第 27 行定義了實例方法,在方法內部調用了這四個委托,并為其傳入實參。第 34 行代碼又定義了一個類,它繼承自基類 Test。因為基類中的委托類型只有 D、D2 和 D3 可以被派生類訪問,所以第 35 行到第 37 行定義了它們的變量。注意,雖然它們和基類中的委托變量是同一種類型, 但是它們是不同的委托。在第 38 行的實例構造方法中,為這三個委托類型的變量創建實例,并為其調用列表加入方法,因為靜態方法 Show1 也被派生類所繼承,所以這里傳入的方法名,可以使用類名引用,也可以不使用類名引用。 第 43 行定義了一個實例方法,方法內部調用了這三個委托,并為其傳入實參。第 51 行定義了派生類的實例,然后調用實例方法Use和Use1。這段代碼的執行結果如下:

方法 Show1 被調用,兩個實參相加的值是:23 方法 Show1 被調用,兩個實參相加的值是:67 方法 Show1 被調用,兩個實參相加的值是:133方法 Show1 被調用,兩個實參相加的值是:445 方法 Show1 被調用,兩個實參相加的值是:67 方法 Show1 被調用,兩個實參相加的值是:89 方法 Show1 被調用,兩個實參相加的值是:155

因為 D 和 D2 的訪問權限被定義成了 protected 和 protected internal。所以下面來驗證在其它程序集中是否可以訪問它們。首先要將本段代碼中的包含 Main 方法的類去掉,然后在它的項目屬性中將它改變為類庫。接下來新建一個控制臺項目,并物理上引用這個類庫??刂婆_項目的代碼如下:

using System;using LycheeTest;namespace LycheeTest1{ class Program: Test { private D pD; private D2 pD2; public Program() {  pD = new D(Show1);  pD2 = new D2(Show1); } public void Use3() {  pD(34, 33);  pD2(12, 11); } static void Main(string[] args) {  Program p = new Program();  p.Use3();  Console.ReadKey(); } }}

因為第 3 行代碼的命名空間和類庫的命名空間是兩個獨立的命名空間,它們的成員不位于同一個命名空間內。所以在一個命名空間內引用另一個命名空間的成員時,需要加上另一個命名空間的名稱進行引用。 為了代碼編寫的方便,第 2 行代碼首先引用了類庫的命名空間。第 4 行代碼定義了一個類,它繼承自基類 Test。因為是派生類,所以對于委托類型 D 和 D2 都可以訪 問。第 5 行代碼和第 6 行代碼分別定義了 D 和 D2 的兩個變量。第 7 行的實例構造方法對這兩個變量進行了實例化,并為其傳入方法 Show1。因為 Show1 方法被繼承了下來,所以這里不需要類名引用。第 11 行代碼定義了一個實例方法,它的作用是調用這兩個委托,并為其傳入實參。第 16 行代碼定義了本類的一個實例,并調用了實例方法 Use3。這段代碼的執行結果如下:

方法 Show1 被調用,兩個實參相加的值是:67方法 Show1 被調用,兩個實參相加的值是:23

類Test中的委托類型D2和D3都具有internal權限,現在來驗證一下,對于一個同一程序集中的非派生類是否可以訪問它們。首先將類庫更改回控制臺項目,然后增加一個類,這個類對于Test類來說是獨立的。它們之間只是位于一個程序集內,彼此沒有繼承關系。代碼如下:

using System;namespace LycheeTest { public class Test { protected delegate void D(int a, int b); private delegate void D1(int a, int b); protected internal delegate void D2(int a, int b); internal delegate void D3(int a, int b); private D myD; private D1 myD1; private D2 myD2; private D3 myD3; public Test() {  myD = new D(Show1);  myD1 = new D1(Show1);  myD2 = new D2(Show1);  myD3 = new D3(Show1); } public static void Show1(int a, int b) {  Console.WriteLine("方法 Show1 被調用,兩個實參相加的值是:{0}", a + b); } public void Show2(int a, int b) {  Console.WriteLine("方法 Show2 被調用,兩個實參相加的值是:{0}", a + b); } public void Show3(int a, int b) {  Console.WriteLine("方法 Show3 被調用,兩個實參相加的值是:{0}", a + b); } public void Use() {  myD(11, 12);  myD1(22, 45);  myD2(55, 78);  myD3(345, 100); } } class Test1 { private Test.D2 tD2; private Test.D3 tD3; public Test1() {  tD2 = new Test.D2(Test.Show1);  tD3 = new Test.D3(Test.Show1); } public void Use3() {  tD2(34, 33);  tD3(22, 21); } } public class Program { static void Main(string[] args) {  Test1 myT1 = new Test1();  myT1.Use3();  Console.ReadKey(); } }}

這段代碼中,原來的類Test沒有進行修改。在第35行上,定義了一個類,它是一個相對于Test類來說獨立的類。它們的關系僅限于同在一個程序集內。第 36 行代碼和第 37 行代碼定義了委托類型D2和D3的兩個變量。這里需要注意,因為這兩個類不是繼承關系,所以要引用Test類中的這兩個委托類型需要使用Test類的類名進行引用。第 38 行代碼是實例構造方法,在構造方法中將委托實例化。實例化委托類型的時候,仍然需要使用類名引用委托類型名,傳遞的方法名也是如此。第 行42 定義了一個實例方法,它調用了委托,并為其傳入了實參。第 49 行代碼定義了類Test1的一個實例,然后第 61 行調用類的實例方法。這段代碼的執行結果如下:

方法 Show1 被調用,兩個實參相加的值是:67方法 Show1 被調用,兩個實參相加的值是:43

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持VEVB武林網!


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91大神福利视频在线| 高清日韩电视剧大全免费播放在线观看| 欧美不卡视频一区发布| 欧美大片在线看| 亚洲成人激情视频| 欧美激情久久久久久| 久久久久99精品久久久久| 日韩亚洲国产中文字幕| 欧美日韩亚洲精品一区二区三区| 中文字幕日韩av| 亚洲一区二区三区sesese| 亚洲精品99久久久久| 亚洲精品国产美女| 777国产偷窥盗摄精品视频| 91在线观看免费高清完整版在线观看| 久久久久免费精品国产| 亚洲国产精品人久久电影| 91精品国产乱码久久久久久久久| 一个色综合导航| 精品国产一区二区三区四区在线观看| 中文字幕欧美精品日韩中文字幕| 日韩av在线免播放器| 麻豆国产精品va在线观看不卡| 国产成人亚洲精品| 精品女厕一区二区三区| 视频在线观看99| 精品久久久久久久久久久| 色婷婷久久一区二区| 久久久综合av| 精品av在线播放| 亚洲变态欧美另类捆绑| 国产成人在线精品| 欧美日韩国产中字| 精品国内自产拍在线观看| 欧美精品激情在线| 在线观看免费高清视频97| 日本一区二区在线播放| 国产91精品高潮白浆喷水| 亚洲国产欧美一区| 精品亚洲一区二区三区在线观看| 成人黄色av网| 国产精品电影久久久久电影网| 欧美性高跟鞋xxxxhd| 亚洲精品美女网站| 38少妇精品导航| 成人有码在线播放| 日韩在线精品视频| 亚洲影院色无极综合| 国产综合久久久久| 日韩视频免费在线观看| 亚洲一区二区三区乱码aⅴ蜜桃女| 97视频国产在线| 久久好看免费视频| 成人激情电影一区二区| 国产亚洲精品成人av久久ww| 亚洲日本欧美日韩高观看| 亚洲午夜小视频| 欧美性猛交99久久久久99按摩| 成人性生交大片免费看小说| 一本色道久久88亚洲综合88| 精品亚洲男同gayvideo网站| 最近2019中文字幕大全第二页| 美乳少妇欧美精品| 亚洲欧美国产精品久久久久久久| 亚洲v日韩v综合v精品v| 欧美视频不卡中文| 欧美大片va欧美在线播放| 国产精品免费视频久久久| 综合欧美国产视频二区| 一区二区三区天堂av| 久久97久久97精品免视看| 亚洲高清免费观看高清完整版| 日韩成人在线电影网| 国产精品久久色| 亚洲午夜久久久久久久| 国产美女扒开尿口久久久| 国产亚洲精品一区二555| 亚洲第一网站免费视频| 国产不卡一区二区在线播放| 欧美大荫蒂xxx| 尤物精品国产第一福利三区| 成人免费看黄网站| 亚洲国产精品女人久久久| 日韩中文字幕第一页| 国产有码在线一区二区视频| 国产z一区二区三区| 高清欧美性猛交xxxx| 热99久久精品| 国产91精品久| www亚洲欧美| 亚洲成人黄色在线观看| 国产一区二区三区欧美| 欧美夫妻性生活xx| 久久免费国产视频| 色婷婷av一区二区三区久久| 欧美精品制服第一页| www.美女亚洲精品| 国产视频自拍一区| 国产精品久久久久91| 久久影视电视剧免费网站清宫辞电视| 97视频在线观看免费高清完整版在线观看| 国产日韩在线免费| 国产亚洲综合久久| 日韩成人av一区| 日韩在线高清视频| 91久久国产综合久久91精品网站| 亚洲男人天堂九九视频| 国内精品国产三级国产在线专| 亚洲欧美制服中文字幕| 欧美成人在线网站| 欧美丰满少妇xxxxx| 久久久久久亚洲精品不卡| 国产精品免费久久久久久| 一区二区三区无码高清视频| 色婷婷综合久久久久| 国产小视频国产精品| 欧美天天综合色影久久精品| 欧美日韩激情小视频| 自拍偷拍亚洲精品| 国产最新精品视频| 丝袜情趣国产精品| 日韩电影中文 亚洲精品乱码| 欧美与黑人午夜性猛交久久久| 国产精品三级网站| 亚洲视频欧洲视频| 欧美亚洲另类激情另类| 亚洲精品成a人在线观看| 精品国产91久久久| 久久久久亚洲精品成人网小说| 91精品久久久久久久久青青| 在线电影中文日韩| 国产999精品久久久影片官网| 欧美成年人网站| 亚洲已满18点击进入在线看片| 日本精品久久久久影院| 韩日精品中文字幕| 亚洲第一色中文字幕| 亚洲福利在线看| 国产精品高清网站| 亚洲va欧美va在线观看| 国产日韩欧美在线播放| 91热福利电影| 亚洲国产成人一区| www.久久撸.com| 欧美成人三级视频网站| 国产精品永久免费视频| 日韩精品亚洲元码| 欧美午夜xxx| 国产亚洲精品成人av久久ww| 欧美激情网站在线观看| 国产免费观看久久黄| 日韩中文字幕视频在线| 欧美日产国产成人免费图片| 亚洲精品国产suv| 国产成人精品视频| 亚洲精品国产精品国产自| 97在线观看视频国产| 国产精品视频精品| 欧美成人午夜免费视在线看片| 亚洲国产精品系列| 久久精品电影一区二区| 日韩欧美精品免费在线| 国产成人综合精品| 亚洲欧美精品suv|