添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

委托(Delegate) 是对某个方法的引用的一种引用类型变量。把方法作为参数传给其他方法;

&emsp引用可在运行时被改变。类似于 C 或 C++ 中函数的指针。

委托(Delegate)特别用于实现事件和回调方法。所有的委托(Delegate)都派生自 System.Delegate 类。

使用委托使程序员可以将方法引用封装在委托对象内。然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。与C或C++中的函数指针不同,委托是面向对象,而且是类型安全的。

内置委托 参数 返回值
Action 没有参数 没有返回值
Action 有参数 没有返回值
Func 可有可无 有返回值
Predicate bool类型参数 bool类型返回值
public delegate int MyDelegate (string s);
//指定该委托的每个实例都可以引用某个参数为string,返回值为int的方法。

  假设要定义一个委托,该委托表示的方法包含有两个int型的参数,返回类型为bool:

delegate bool MyDelegate(int x, int y);

  委托对象必须使用 new 关键字来创建,且与一个特定的方法有关。
  当创建委托时,传递到 new 语句的参数就像方法调用一样书写,但是不带有参数。而是传递那个特定的方法。

public delegate void printString(string s);
printString ps1 = new printString(WriteToScreen);
printString ps2 = new printString(WriteToFile);
ps1("Im a string");

  委托对象可使用 “+” 运算符进行合并。一个合并委托调用它所合并的两个委托。只有相同类型的委托可被合并。"-" 运算符可用于从合并的委托中移除组件委托。

  使用委托的这个有用的特点,您可以创建一个委托被调用时要调用的方法的调用列表。这被称为委托的 多播(multicasting),也叫组播。

using System;
delegate int NumberChanger(int n);
namespace DelegateAppl
   class TestDelegate
      static int num = 10;
      public static int AddNum(int p)
         num += p;
         return num;
      public static int MultNum(int q)
         num *= q;
         return num;
      public static int getNum()
         return num;
      static void Main(string[] args)
         // 创建委托实例
         NumberChanger nc;
         NumberChanger nc1 = new NumberChanger(AddNum);
         NumberChanger nc2 = new NumberChanger(MultNum);
         nc = nc1;
         nc += nc2;
         // 调用多播
         nc(5);  //等价于nc1(5); nc2(5);
         Console.WriteLine("Value of Num: {0}", getNum());
         Console.ReadKey();
 

Value of Num: 75

Action

  Action是CLR环境中给我们内置(或者说预定义)的一个委托类型,它可以指向一个没有返回值且没有参数的方法。其泛型实现Action最多可以引用具有16个参数的方法。

public delegate void Action(); //指向一个没有返回值且没有参数的方法。
public delegate void Action<in T>(T obj); //接受一个带参数的方法,参数可以为任意类型。in 表示传入一个无法被修改的引用参数。简单来说,就是引用一个类型就定下这个类型不能变了。

  同样也可以直接用Lambd表达式直接把方法定义在委托中,代码如下:

Action<int, int> t = (a,b) => { Console.WriteLine(a + b); };
t(2, 3);

  Func委托始终都会有返回值,返回值的类型是参数中最后一个,可以传入一个参数,也可以最多传入16个参数,两个参数一个返回值的声明原型为:

public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);
public bool Compare(int a, int b)
    return a > b;
Func<int, int, bool> t = new Func<int, int, bool>(Compare);//传入两个int参数,返回bool值
bool result = t(2, 3);

  同样也可以直接用Lambd表达式直接把方法定义在委托中,代码如下:

Func<int, int, bool> t = (a, b) => { return a > b; };
bool result = t(2, 3);

Predicate

  Predicate委托表示定义一组条件并确定指定对象是否符合这些条件的方法,返回值始终为bool类型:

public delegate bool Predicate<in T>(T obj);
public bool Match(int val)
    return val > 60;
Predicate<int> t = new Predicate<int>(Match);   //定义一个比较委托
int[] arr = { 13, 45, 26, 98, 3, 56, 72, 24 };
int first = Array.Find(arr, t);                 //找到数组中大于60的第一个元素

  用Lambd表达式直接把方法定义在委托中:

Predicate<int> t = val => { return val > 60;};   //定义一个比较委托
int[] arr = { 13, 45, 26, 98, 3, 56, 72, 24 };            
int first = Array.Find(arr, t);                  //找到数组中大于60的第一个元素
                    Delegate  委托(Delegate) 是对某个方法的引用的一种引用类型变量。把方法作为参数传给其他方法; &amp;emsp引用可在运行时被改变。类似于 C 或 C++ 中函数的指针。  委托(Delegate)特别用于实现事件和回调方法。所有的委托(Delegate)都派生自 System.Delegate 类。  使用委托使程序员可以将方法引用封装在委托对象内。然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。与C或C++中的函数指针不同,委托是面向对象
        委托(delegate)是一种可以把引用存储为函数的类型。这听起来相当棘手,但其机制是非常简单的。委托最重要的用途在本书后面介绍到事件和事件处理时才能解释清楚,但这里也将介绍有关委托的许多内容。委托的声明非常类似于函数,但不带函数体,且要使用delegate关键字。委托的声明指定了一个返回类型和一个参数列表。
        在定义了委托后,就可以声明该委托类型的变量。接着把这...
				
关于代码的组成,有一些细节书本上的阐述方式我不太理解,所以直接问了: publicdelegateintTestDelegate(MyTypem,longnum); 1.public是定义这个语句中的方法是可以被PUBLIC的,所以我理解为定义的一种 2.int是赋予TestDelegate这个变量的输出类型是int 3.那delegate这个单词是理解为语句的函数...
一个委托可以绑定多个方法,使用"+="就可以向委托中添加新的方法,使用"-="可以从委托中删除方法: 如果我们从委托中减去一个它根本未添加过的方法,会怎么样呢?答案是不会报错,也不会有任何影响。 还有更加现实的问题,就是如果添加的方法中有多个方法都有返回值,那怎么办?只返回最后一个具有返回值的方法的返回值。 委托的工作原理 我们先来个委托类型的声明: public delegat...
delegate是表示对具有特定参数列表和返回类型的方法的引用的类型。在实例化委托时,你可以将其实例与任何具有兼容签名和返回类型的方法相关联。你可以通过委托实例调用方法。 委托用于将方法作为参数传递给其他方法。事件处理程序就是通过委托调用的方法。你可以创建一个自定义方法,当发生特定事件时,某个类(如 Windows 控件)就可以调用你的方法。下面的示例演示了...
C#用了4年了,之前一直对“委托”这个概念不是很理解,前几天突然就豁然开朗了。所以在这里记一下,希望这不仅是对自己成长的记录,也可以帮到其他小伙伴。 C#委托,可以看成是一种函数指针,它将会非常有用当你想将某个方法作为参数传入另外一个方法时(我也想吐槽一下这样写语序有些偏英文化,但是貌似这样写会使主体表达更连贯?)。 委托可以使用delegate实现,但本文所讨论的是委托的另外两种实...
好的,很高兴回答你关于 C# 中委托的问题。 委托是一个类,它允许您将方法作为参数传递给其他方法。它是一种类型安全的函数指针。在 C# 中,委托声明使用 delegate 关键字。当您声明一个委托时,您需要指定它可以代表的方法的签名(即返回类型和参数类型)。 下面是一个简单的示例,演示如何使用委托: ```csharp delegate int MyDelegate(int x, int y); class Program static int Add(int x, int y) return x + y; static int Subtract(int x, int y) return x - y; static void Main(string[] args) MyDelegate del1 = Add; MyDelegate del2 = Subtract; Console.WriteLine(del1(10, 5)); // 输出 15 Console.WriteLine(del2(10, 5)); // 输出 5 在这个例子中,我们声明了一个委托类型 MyDelegate,它可以代表一个接受两个 int 类型参数并返回 int 类型结果的方法。然后,我们声明了两个方法 Add 和 Subtract,它们都符合 MyDelegate 的签名。最后,我们创建了两个委托实例 del1 和 del2,分别指向 Add 和 Subtract 方法。我们可以调用这些委托实例,传递它们的参数,并获得它们的结果。 希望这可以解答您的问题。如果您还有任何问题,请告诉我!