委 托 委托 委托


委托,和类、接口、int、string一样属于一种类型


委托是引用类型


委托(Delegate)是存有对某个方法的引用的一种引用类型变量。


引用可在运行时被改变。用于将方法作为参数传递给其他方法。


委托是一个类,它定义了方法的类型


换句说法:委托是一个类,它定义了方法的类型(比如String类,定义了字符串的类型),使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用lf- Else(Switch)语句,同时使得程序具有更好的可扩展性。

需要注意的是在定义时参数类型和个数要与你想委托的方法一致。


使用委托可以将多个方法绑定到同个委托变量,当调用此变量时(这里用“调用”这个词,是因为此变量代表一个方法),可以依次调用所有绑定的方法。

委托_c#


1.方法的描述

委托,delegate ,是C#中一种回调的实现
-对应C++/Qt里的槽


C#委托的四种形式(delegate、Action、Func、predicate)

(1)delegate

Delegate至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型。

public delegate int MethodDelegate(int x, int y);
private static MethodDelegate method;
static void Main(string[] args)
{
    method = new MethodDelegate(Add);
    Console.WriteLine(method(60,20));
    Console.ReadKey();
}

private static int Add(int x, int y)
{
    return x + y;
}

(2)Action

Action是无返回值的泛型委托。至少0个参数,至多16个参数,无返回值

static void Main(string[] args)
{
   Test<string>(Action,"Hello World!");
   Test<int>(Action, 1000);
   Test<string>(p => { Console.WriteLine("{0}", p); }, "Hello World");//使用Lambda表达式定义委托
   Console.ReadKey();
}
public static void Test<T>(Action<T> action, T p)
{
   action(p);
}
private static void Action(string s)
{
   Console.WriteLine(s);
}
private static void Action(int k)
{
   Console.WriteLine(k);
}

(3)Func

Func是有返回值的泛型委托。 Func至少0个参数,至多16个参数,根据返回值泛型返回。必须有返回值,不可void。

(4) predicate

predicate 是返回bool型的泛型委托。Predicate有且只有一个参数,返回值固定为bool


在C#里面,如何描述一个方法呢?
1 参数类型列表
2 返回值类型
比如,

public void test1(int a)

“一个参数为(int)的、返回值为void的方法”

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

namespace CSharp基础语法
{
    public class Example
    {
       public void test1(int a)
        {
            Console.WriteLine("test1:" + a);
        }

        public void test2(int b)
        {
            Console.WriteLine("test2:" + b);
        }

        public int test3(int m)
        {
            Console.WriteLine("test3:" + m);

            return m * m;
        }

        public int test4(int a)
        {
            Console.WriteLine("test4:" + a);
            return a + a;
        }

        public int test5(int x,int y)
        {
            return x + y;
        }
    }
}

1对test1(), test2(), test3(), test4(), test5()进行描述
2对此五个方法进行规类
可以发现,test1,test2同属一类,test3,test4同属一类

2.委托 delegate

委托,delegate,是一个对方法类型的描述

例如:

public delegate void DFunction(int a);

则DFunction类型指的是“一种参数为(int)、返回值为void的方法”

类比一下,会更易懂:

public class Student{}
public interface Player{}
public delegate void DFunction (int a);

其中,delegate声明它是个委托类型,DFunction是类型的名字。


一个委拖对象,就是一个方法的实例例如:

DFurction d = new DFunction(ex.test1);
d(18);

传参时,要指定某个对象的某个方法


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

namespace CSharp基础语法
{
    public class Example
    {
       public void test1(int a)
        {
            Console.WriteLine("test1:" + a);
        }

        public void test2(int b)
        {
            Console.WriteLine("test2:" + b);
        }

        public int test3(int m)
        {
            Console.WriteLine("test3:" + m);

            return m * m;
        }

        public int test4(int a)
        {
            Console.WriteLine("test4:" + a);
            return a + a;
        }

        public int test5(int x,int y)
        {
            return x + y;
        }
    }
}

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

namespace CSharp基础语法
{
    // 第一类方法
    public delegate void NumberOneFunction(int a);
    // 第二类方法
    public delegate int NumberTwoFunction(int b);
    // 第三类方法
    public delegate int NumberThreeFunction(int a, int b);
    class Program
    {
        static void Main(string[] args)
        {
            Example ex = new Example();

            NumberOneFunction num1 = new NumberOneFunction(ex.test1);
            num1(18); // == ex.test1(18)


         }
    }
}


3.委拖的更多用法

1委托的调用,以下两种方式等效:

DogFunction dog =new DogFunction(ex.Test);
dog(18);
dog.Invoke(18);

其中:dog是一个委托(方法),dog(18)就是调用这个方法,dog.Invoke(18)也是调个方法。

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

namespace CSharp基础语法
{
    public class Example
    {
      // 实例方法
      public void Test(int a)
        {
            Console.WriteLine("Test:" + a);
        }

        // 静态方法
        public static void Print(int a)
        {
            Console.WriteLine("Print:" + a);
        }
    }
}

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

namespace CSharp基础语法
{
    // 第一类方法
    public delegate void NumberOneFunction(int a);

    class Program
    {
        static void Main(string[] args)
        {
            Example ex = new Example();

            // 实例方法的调用
            NumberOneFunction num1 = new NumberOneFunction(ex.Test);
            num1(100);
            num1.Invoke(100);

             静态方法的调用
            NumberOneFunction num11 = new NumberOneFunction(Example.Print);
            num11(1100);
            num11.Invoke(1100);

        }
    }
}


委托_c#_02


3委拖是一种类型,可以和 class, interiface同级定义

public delegate void DFunction (int a);
public class YourClass {};

也可以作为内部类型

public class YourClass{
public delegate void DFunction (int a);}

全称:YourNameSpace.YourClass.DFunction