C# 關於委託的一點心得

來源:互聯網
上載者:User

標籤:

使用委託按照函數類型定義委託

委託的作用:1、動態調用函數

                2、函數回調和事件機制的基礎

    對於有C++經驗的人來說,可以把委託理解為函數指標;對於沒有C++經驗的人來說,委託可以理解為一種特殊的資料類型---函數的類型。

    對於C#來說,和普通的資料類型一樣,函數也有類型,只不過函數的類型是通過函數的傳回值類型以及參數列表決定的,如果兩個函數的傳回型別,以及參數的順序和類型,參數的數量完全相同,那麼就可以說這兩個函數類型相同。

    那麼,就可以用委託來表示某種特定類型的函數,並且可以表示多個函數,使用委託就好像調用這些函數,由於它可以串聯多個函數,所以就會按照串聯的順序依次調用這些函數,如果有傳回值,那麼將返回最後一個函數的傳回值。

    委託既然可以理解為一種特定的類型,那麼,它實質上是一個類,編譯器會根據關鍵字“delegate”自動從System.Delegate類派生一個類,那麼,委託也可以有它的存取修飾詞,如private、public等,同業也有它自己的成員。

C#中用關鍵字“delegate”來定義委託(定義一種資料類型)

Delegate returntype DelegateName(Type1 para1,Type2 para2,…);

用委託動態調用函數

    既然委託可以理解為一種特定的資料類型,那麼使用委託跟使用其他資料類型一樣,一般分為三個步驟:1、聲明委託變數,跟聲明普通類型的變數一樣。2、為委託變數賦值,委託變數可以看成是一個函數鏈表,可以通過”=“為函數鏈表指定唯一函數,也可以通過”+=“為函數鏈表指定多個函數,還一個通過”-=“從函數鏈表中刪除指定函數。3使用委託變數,像使用函數那樣直接使用委託變數,例如定義了一個委託變數voidFunc,那麼使用它的時候,直接”voidFunction()“,也可以通過調用委託變數的成員函數”invoke()“來使用委託變數,例如”voidFunc.Invoke()“。

 

用委託傳遞函數參數

    在使用委託變數的時候指定參數而已。

例子

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace DelegateApp

{

    class Program

    {

        delegate void DSimpleVoidFunc();

        delegate float DFloatFunc(int val1,float val2);

        static void Main(string[] args)

        {

            DSimpleVoidFunc voidfun;   //聲明委託變數

            voidfun = PrintHaHa;       //為委託變數賦值

            voidfun();                 //使用委託變數

            voidfun += PrintHeHe;

            voidfun();

            voidfun -= PrintHeHe;

            voidfun.Invoke();

            UseParaDelegate();

           

            Console.ReadLine();

        }

        static void PrintHaHa()

        {

            Console.WriteLine("HaHa...");

        }

        static void PrintHeHe()

        {

            Console.WriteLine("HeHe...");

        }

        static void UseParaDelegate()

        {

            DFloatFunc floatfunc;

            float result;

            floatfunc = Add;

            result = floatfunc(5, 2.0f);

            Console.WriteLine("1. Result={0}",result);

            floatfunc += Sub;

            result = floatfunc(5, 2.0f);

            Console.WriteLine("2. Result={0}", result);

            floatfunc += Mul;

            result = floatfunc(5, 2.0f);

            Console.WriteLine("3. Result={0}", result);

            floatfunc -= Mul;

            floatfunc += Add;

            result = floatfunc.Invoke(5,2.0f);

            Console.WriteLine("4. Result={0}", result);

        }

        static float Add(int val1,float val2)

        {

            Console.WriteLine("{0}+{1}={2}", val1, val2, val1 + val2);

            return val1 + val2;

        }

        static float Sub(int val1,float val2)

        {

            Console.WriteLine("{0}-{1}={2}", val1, val2, val1 - val2);

            return val1 - val2;

        }

        static float Mul(int val1,float val2)

        {

            Console.WriteLine("{0}*{1}={2}", val1, val2, val1 * val2);

            return val1 * val2;

        }

    }

}

 

C# 關於委託的一點心得

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.