亚洲精品亚洲人成在线观看麻豆,在线欧美视频一区,亚洲国产精品一区二区动图,色综合久久丁香婷婷

              當(dāng)前位置:首頁(yè) > IT技術(shù) > Windows編程 > 正文

              C#:委托
              2021-09-03 18:27:09

              C#?委托(Delegate)

              C# 中的委托(Delegate)類似于 C 或 C++ 中函數(shù)的指針。委托(Delegate)?是存有對(duì)某個(gè)方法的引用的一種引用類型變量。引用可在運(yùn)行時(shí)被改變。

              委托(Delegate)特別用于實(shí)現(xiàn)事件和回調(diào)方法。所有的委托(Delegate)都派生自?System.Delegate?類。

              聲明委托(Delegate)

              委托聲明決定了可由該委托引用的方法。委托可指向一個(gè)與其具有相同標(biāo)簽的方法。

              例如,假設(shè)有一個(gè)委托:

              public delegate int MyDelegate (string s);

              上面的委托可被用于引用任何一個(gè)帶有一個(gè)單一的?string?參數(shù)的方法,并返回一個(gè)?int?類型變量。

              聲明委托的語(yǔ)法如下:

              delegate <return type> <delegate-name> <parameter list>

              實(shí)例化委托(Delegate)

              一旦聲明了委托類型,委托對(duì)象必須使用?new?關(guān)鍵字來(lái)創(chuàng)建,且與一個(gè)特定的方法有關(guān)。當(dāng)創(chuàng)建委托時(shí),傳遞到?new?語(yǔ)句的參數(shù)就像方法調(diào)用一樣書寫,但是不帶有參數(shù)。例如:

              public delegate void printString(string s);
              ...
              printString ps1 = new printString(WriteToScreen);
              printString ps2 = new printString(WriteToFile);

              下面的實(shí)例演示了委托的聲明、實(shí)例化和使用,該委托可用于引用帶有一個(gè)整型參數(shù)的方法,并返回一個(gè)整型值。

              using System;
              
              delegate int NumberChanger(int n);
              namespace DelegateAppl
              {
                 class TestDelegate
                 {
                    static int num = 10;
                    public static int AddNum(int p)
                    {
                       num += p;
                       return num;
                    }
              
                    public static int MultNum(int q)
                    {
                       num *= q;
                       return num;
                    }
                    public static int getNum()
                    {
                       return num;
                    }
              
                    static void Main(string[] args)
                    {
                       // 創(chuàng)建委托實(shí)例
                       NumberChanger nc1 = new NumberChanger(AddNum);
                       NumberChanger nc2 = new NumberChanger(MultNum);
                       // 使用委托對(duì)象調(diào)用方法
                       nc1(25);
                       Console.WriteLine("Value of Num: {0}", getNum());
                       nc2(5);
                       Console.WriteLine("Value of Num: {0}", getNum());
                       Console.ReadKey();
                    }
                 }
              }

              當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:

              Value of Num: 35
              Value of Num: 175

              委托的多播(Multicasting of a Delegate)

              委托對(duì)象可使用 "+" 運(yùn)算符進(jìn)行合并。一個(gè)合并委托調(diào)用它所合并的兩個(gè)委托。只有相同類型的委托可被合并。"-" 運(yùn)算符可用于從合并的委托中移除組件委托。

              使用委托的這個(gè)有用的特點(diǎn),您可以創(chuàng)建一個(gè)委托被調(diào)用時(shí)要調(diào)用的方法的調(diào)用列表。這被稱為委托的?多播(multicasting),也叫組播。下面的程序演示了委托的多播:

              using System;
              
              delegate int NumberChanger(int n);
              namespace DelegateAppl
              {
                 class TestDelegate
                 {
                    static int num = 10;
                    public static int AddNum(int p)
                    {
                       num += p;
                       return num;
                    }
              
                    public static int MultNum(int q)
                    {
                       num *= q;
                       return num;
                    }
                    public static int getNum()
                    {
                       return num;
                    }
              
                    static void Main(string[] args)
                    {
                       // 創(chuàng)建委托實(shí)例
                       NumberChanger nc;
                       NumberChanger nc1 = new NumberChanger(AddNum);
                       NumberChanger nc2 = new NumberChanger(MultNum);
                       nc = nc1;
                       nc += nc2;
                       // 調(diào)用多播
                       nc(5);
                       Console.WriteLine("Value of Num: {0}", getNum());
                       Console.ReadKey();
                    }
                 }
              }

              當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:

              Value of Num: 75

              委托(Delegate)的用途

              下面的實(shí)例演示了委托的用法。委托?printString?可用于引用帶有一個(gè)字符串作為輸入的方法,并不返回任何東西。

              我們使用這個(gè)委托來(lái)調(diào)用兩個(gè)方法,第一個(gè)把字符串打印到控制臺(tái),第二個(gè)把字符串打印到文件:

              ?
              using System;
              using System.IO;
              
              namespace DelegateAppl
              {
                 class PrintString
                 {
                    static FileStream fs;
                    static StreamWriter sw;
                    // 委托聲明
                    public delegate void printString(string s);
              
                    // 該方法打印到控制臺(tái)
                    public static void WriteToScreen(string str)
                    {
                       Console.WriteLine("The String is: {0}", str);
                    }
                    // 該方法打印到文件
                    public static void WriteToFile(string s)
                    {
                       fs = new FileStream("c:\message.txt",
                       FileMode.Append, FileAccess.Write);
                       sw = new StreamWriter(fs);
                       sw.WriteLine(s);
                       sw.Flush();
                       sw.Close();
                       fs.Close();
                    }
                    // 該方法把委托作為參數(shù),并使用它調(diào)用方法
                    public static void sendString(printString ps)
                    {
                       ps("Hello World");
                    }
                    static void Main(string[] args)
                    {
                       printString ps1 = new printString(WriteToScreen);
                       printString ps2 = new printString(WriteToFile);
                       sendString(ps1);
                       sendString(ps2);
                       Console.ReadKey();
                    }
                 }
              }
              
              ?

              當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:

              The String is: Hello World

              ?

              本文摘自 :https://blog.51cto.com/u

              開(kāi)通會(huì)員,享受整站包年服務(wù)立即開(kāi)通 >