C#委托

认识委托

C#委托是一个很常用的 是存有对某个方法的引用的一种引用类型变量 。常用于回调,System.Delegate 类 是委托类型的基类

声明委托

方法:delegate

delegate void D(int x, int z);//声明委托

public delegate void D(int x, int z);//声明委托

static void A(int x, int z)
    {
        int y = x + z;
        Console.WriteLine(y);//输出
    }

    public static void S()
    {
        D v = new D(A);//new实例化委托

        v(3, 2);//赋值

    }
}

输出结果:5

运行截图

内置的3种泛型委托

Action<T>只能委托必须是无返回值的方法

static void A(int x)
        {
            Console.WriteLine(x);
        }

        public static void S()
        {
            Action<int> v = new Action<int>(A);//new实例化委托
            v(999);
        }
}
Action委托

Func<TResult>只是委托必须有返回值的方法

static int A(int x,int y)
        {
            x = x + y;
            return x;
        }

        public static void S()
        {
            Func<int,int,int> v = new Func<int,int,int>(A);//new实例化委托
            Console.WriteLine( v(999,1));
        }
Func委托

Predicate:此委托返回一个bool值,该委托通常引用一个”判断条件函数”。

    static bool A(int x)//只能有一个传入值
    {
        if(x == 1000)
        {
            return true;
        }
        else
        {
            return false;
        }

    }

    public static void S()
    {
        Predicate<int> v = new Predicate<int>(A);//new实例化委托
        Console.WriteLine(v(1000));
        Console.WriteLine(v(999));
    }
Predicate委托

PS:个人感觉给的三个泛委托,使用蛮方便的

委托的多播 ( 委托链 )

一个委托对象是可以连接多个委托用“+=”相反用“-=”也可以移除委托

        public delegate int D(int x, int z);//声明委托

        static int A(int x, int z)
        {

            return x + z;
        }

        static int Z(int x,int z)
        {
            return x + z + x;
        }

        public static void S()
        {
            D V = new D(A);
            V += new D(Z);
            Console.WriteLine(V(10, 100));
            Console.ReadKey();
        }
委托的多播

PS:我写的代码并无多大作用……

总结

委托就学习到这里了。如果有什么错误的地方请给我留言,

学习时去看了别的博客文章

https://www.cnblogs.com/dotnet261010/p/6052829.html

http://www.runoob.com/csharp/csharp-delegate.html

https://www.cnblogs.com/caoyc/p/6382132.html

如果想更加详细了解的话可以查看

https://docs.microsoft.com/zh-cn/dotnet/api/system.delegate?redirectedfrom=MSDN&view=netframework-4.7.2

看了一下官方的文档,感觉这个蛮重要的

Delegate类是委托类型的基类。 但是,只有系统和编译器可以派生自显式Delegate类或从MulticastDelegate类。 此外,还不允许从委托类型派生新类型。 Delegate类不被视为是委托类型; 它是用于委托类型派生一个类。

大多数语言实现delegate关键字,并为这些语言的编译器可派生自MulticastDelegate类; 因此,用户应使用delegate语言提供的关键字。

 备注

公共语言运行时提供Invoke对于每个委托类型,具有相同的签名与委托的方法。 您不需要显式调用此方法,从 C#、 Visual Basic 或 Visual c + +,因为编译器会自动调用。 Invoke方法可在反射时想要查找的委托类型签名。

公共语言运行时提供每个委托类型与BeginInvokeEndInvoke方法,以便能够异步调用的委托。 有关这些方法的详细信息,请参阅Calling Synchronous Methods Asynchronously

委托类型的声明建立指定的一个或多个方法签名的协定。 委托是所引用的委托类型的实例:

  • 类型和可分配给该类型的目标对象的实例方法。
  • 具有隐藏的类型的实例方法this参数在形参表中公开。 委托被称为是一个委托,它打开的实例。
  • 一种静态方法。
  • 静态方法,并且可分配给该方法的第一个参数的目标对象。 委托被称为封闭式其第一个参数。

-来自官方文档

0 评论
留言