C#中委托的理解

C#中的委托类似于C++中的函数指针,是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用。

委托包含两部分,委托的声明和委托的实例化。

委托的声明示例如下:

public delegate string printString(string str);

委托的实例有两种方式,一种是通过new的方式创建,另一种方式是通过"+="注册的方式创建。

通过new创建实例的示例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    internal class Program
    {
        public delegate string printString(string str);

        public string PrintOK(string str)
        {
            string newStr = str + " OK";
            return newStr;
        }

        public string PrintError(string str)
        {
            string newStr = str + " Error";
            return newStr;
        }

        public void printInfo(string str)
        {
            printString ps1 = new printString(PrintOK);
            printString ps2 = new printString(PrintError);

            Console.WriteLine(ps1(str));
            Console.WriteLine("---------------------");
            Console.WriteLine(ps2(str));
            Console.WriteLine("---------------------");
        }

        static void Main(string[] args)
        {
            Program p = new Program();
            p.printInfo("hello");
           
            Console.ReadKey();
        }
    }
}

返回值如下:

hello OK
---------------------
hello Error
---------------------

通过"+="注册的方式创建实例的示例

说明:通过+=方式注册的函数都会被执行,但是假如delegate方法有返回值,则只返回最后一次注册的返回值

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    internal class Program
    {
        public delegate int addNum(int i);
        public static int num = 0;

        public int addOne(int i)
        {
            num += 1;
            return i + 1;
        }

        public int addTwo(int i)
        {
            num += 2;
            return i + 2;
        }

        public int addNumResult(int i)
        {
            addNum an = null;
            an += addOne;
            an += addTwo;
            return an(i);
        }

        static void Main(string[] args)
        {
            Program p = new Program();

            int result = p.addNumResult(10);
            Console.WriteLine(result);
            Console.WriteLine(num);

            Console.ReadKey();
        }
    }
}

此时返回:

12(代表只返回最后一个注册函数的值)

3(代表所有的注册函数都执行了一遍)

你可能感兴趣的:(c#,开发语言)