EKsumic's Blog

let today = new Beginning();

Click the left button to use the catalog.

OR

C#委托(上)

委托是一个对象,它知道如何调用一个方法。

委托类型委托实例

委托类型定义了委托实例可以调用哪类方法,具体来说,委托类型定义了方法返回的类型参数

委托的实例其实就是调用者的委托

调用者调用委托,然后委托调用目标方法

你可以理解为函数指针。或者理解为C语言里面goto就行了,它反正就是指向了一个方法。

直接上代码:

public class Program
    {
        delegate int Transformer(int x);
        static int Square(int x) => x * x;
        static void Main(string[] args)
        {
            Transformer t = Square;
            int result = t(3);
            Console.WriteLine(result);
            Console.ReadKey();
        }
    }

简写1:

Transformer t = Square;

Transformer t = new Transformer(Square);

简写2:

t(3);

t.Invoke(3);

输出结果:

9

注意:

方法是在运行时才赋值给委托变量的。

编写出插件式方法:

   //声明委托
    public delegate int Transformer(int x);  
    public class Util
    {
        //定义一个静态方法2
        public static void Transform(int[] values, Transformer t)
        {
            for (int i = 0; i < values.Length; i++)
            {
                values[i] = t(values[i]);
            }
        }
    }
    public class Program
    {
        //定义一个静态方法1
        static int Square(int x) => x * x;
        static void Main(string[] args)
        {
            int[] values = { 1, 2, 3 };
            Util.Transform(values, Square);
            foreach(int i in values)
            {
                Console.WriteLine($"{i}");
            }
            Console.ReadKey();
        }
    }

输出结果:

1

4

9

委托变量使用+或+=操作符时,其操作数可以是null。就相当于把一个新的值赋给了委托变量。

SomeDelegate d=null;
d+=SomeMethod1;

相当于

d=SomeMethod1;

对单个目标方法的委托变量,使用-=操作符时,就相当于把null赋值给了委托变量。

 

多播:

public delegate int Transformer(int x);
    public class Program
    {
        static int Square(int x)
        {
            var result = x * x;
            Console.WriteLine(result);
            return result;
        }
        
        static int Cube(int x)
        {
            var result = x * x * x;
            Console.WriteLine(result);
            return result;
        }

        static void Main(string[] args)
        {
            Transformer t = null;
            t += Square;
            t += Cube;
            var result = t(3);
            Console.ReadKey();
        }
    }

注意:

委托是不可变的。

我们在使用+=或者-=这类符号的时候,实际上是新创建了一个委托实例。

如果多播委托的返回类型不是void,那么调用者从最后一个被调用的方法来接收返回值。
前面的方法仍然会被调用,但是其返回值就被弃用了。

所有的委托类型都派生于System.MulticastDelegate,而它又派生于System. Delegate。
C#会把作用于委托的+,-,+=, -+操作编译成使用System. Delegate的Combine和Remove两个静态方法。

下一篇:C#委托(下)

This article was last edited at 2020-12-13 15:48:21

cheap cialis no prescription

Hi to all, because I am in fact eager of reading this web site's post to be updated on a regular basis. It consists of nice material.

reply

2021-12-11 08:17:09

* *