委 托 委托 委托
委托,和类、接口、int、string一样属于一种类型
委托是引用类型
委托(Delegate)是存有对某个方法的引用的一种引用类型变量。
引用可在运行时被改变。用于将方法作为参数传递给其他方法。
委托是一个类,它定义了方法的类型
换句说法:委托是一个类,它定义了方法的类型(比如String类,定义了字符串的类型),使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用lf- Else(Switch)语句,同时使得程序具有更好的可扩展性。
需要注意的是在定义时参数类型和个数要与你想委托的方法一致。
使用委托可以将多个方法绑定到同个委托变量,当调用此变量时(这里用“调用”这个词,是因为此变量代表一个方法),可以依次调用所有绑定的方法。
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); } } }
3委拖是一种类型,可以和 class, interiface同级定义
public delegate void DFunction (int a); public class YourClass {};
也可以作为内部类型
public class YourClass{ public delegate void DFunction (int a);}
全称:YourNameSpace.YourClass.DFunction