C#委托詳解(2):實現方式大全


本系列文章將詳細探討C#中的委托,列舉其主要的實現方式,並分析其在設計層面和編碼層面帶來的好處,最后會討論其安全性和執行效率等。

接上篇(C#委托詳解(1):什么是委托)介紹完什么是委托之后,來看看C#中實現委托有哪些方式及各自主要適用范圍。

1、常規實現

        private delegate String getAString();
        static void Main(String []args)
        {
            int temp = 40;
            getAString stringMethod = new getAString(temp.ToString);
            Console.WriteLine("String is {0}", stringMethod());//這里stringMethod()等價於調用temp.ToString();
            Console.ReadLine();
        }

 

這段代碼中,實例化了類型為GetAString的一個委托,並對它進行初始化,使它引用整型變量temp的ToString()方法。在C#中,委托在語法上總是接受一個參數的構造函數,這個參數就是委托引用的方法。上例中stringMethod()等價於使用temp.ToString(),同時也與調用委托類的Invoke()方法完全相同,實際上,如下圖IL代碼中紅色部分所示,C#編譯器會用stringMethod.Invoke()代替stringMethod()。

032104

為了簡便輸入,C#支持只傳送地址的名稱給委托的實例(委托推斷),如下兩行代碼在編譯器看來是一樣的。

          getAString stringMethod = new getAString(temp.ToString);
          getAString stringMethod = temp.ToString;

實際上委托的實例可以引用任何類型的任何對象上的實例方法或靜態方法,只要方法的簽名匹配於委托的簽名即可。所以結構體的方法一樣可以傳遞給委托。

2、多播委托

多播委托具有一個帶有鏈接的委托列表,稱為調用列表,在對委托實例進行調用的時候,將按列表中的委托順序進行同步調用。如果委托有返回值,則將列表中最后一個方法的返回值用作整個委托調用的返回值。因此,使用多播委托通常具有void返回類型。

可以使用+=來使委托指向多個方法的地址,但必須是在委托實例化之后才可以使用+=來添加新的方法地址(添加重復的方法地址編譯器不會報錯,但是也不會重復執行),若想移除其中的方法地址可以使用-=來實現(需要至少保留一個,即對於最后一個方法地址的移除不起作用)。以下代碼中下面兩行無論單獨保留哪行,最終的執行結果都是相同的。

         getAString stringMethod = new getAString(temp.ToString);
         stringMethod += temp.ToString;
         stringMethod -= temp.ToString;

 

3、委托數組

    delegate double Operations(double x);

    class Program
    {
        static void Main()
        {
            Operations[] operations =
            {
               MathOperations.MultiplyByTwo,
               MathOperations.Square
            };

            for (int i = 0; i < operations.Length; i++)
            {
                Console.WriteLine("Using operations[{0}]:", i);
                DisplayNumber(operations[i], 2.0);
                DisplayNumber(operations[i], 7.94);
                Console.ReadLine();
            }
        }

        static void DisplayNumber(Operations action, double value)
        {
            double result = action(value);
            Console.WriteLine(
               "Input Value is {0}, result of operation is {1}", value, result);
        }
    }

    struct MathOperations
    {
        public static double MultiplyByTwo(double value)
        {
            return value * 2;
        }

        public static double Square(double value)
        {
            return value * value;
        }
    }

 

上述代碼中實例化了一個委托數組operations(與處理類的實例相同),該數組的元素初始化為MathOperations類的不同操作,遍歷這個數組,可以將每個操作應用到2個不同的值中。這種用法的好處是,可以在循環中調用不同的方法。

(不早了,今天先寫到這,下一篇接着寫委托的實現方式。)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM