C#委托是一种特殊的类,它可以引用一个或多个方法,并允许在运行时调用它们。委托是一种引用类型,它可以指向一个方法,而不是存储实际的数据。委托可以将方法作为参数传递给其他方法,这样就可以在运行时动态地调用该方法。
C#中的委托有三个重要的特性:
1. 委托是一种引用类型。 2. 委托可以引用多个方法。 3. 委托可以将方法作为参数传递给其他方法。
C#中的委托有三种不同的形式:单播委托、多播委托和匿名函数。单播委托是最常见的形式,它允许你将一个函数作为参数传递到另一个函数中。多播委托允许你将多个函数作为参数传递到另一个函数中;而匿名函数则允许你在不声明新函数的情况下直接使用代码块来实现功能。
C#中的委托非常有用,因此它已成为.NET Framework中重要的部分。例如,Windows Forms库使用了大量的委托来处理事件响应、UI呈现和图形处理。此外,LINQ也使用了大量的委托来实现对集合进行查询、过滤和转换功能。
总之,C#中的委托是一项非常有用的功能;它使得我们能够在运行时动态地访问和调用代码片断;而这正是.NET Framework中大量库都使用了C#中的委托来实现功能的原因之一。
委托是调用方法的对象。我们可以认为委托是函数指针或函数类型。
委托类型定义委托实例可以调用的方法类型。
委托类型定义方法的返回类型及其参数类型。
下面定义一个称为Converter的委托类型:
delegate int Converter (int x);
Converter
与任何方法与 int
返回类型和单个 int
参数兼容,如:
static int Square (int x) { return x * x; }
将一个方法分配给一个委托变量创建一个委托实例:
Converter t = Square;
其可以以与方法相同的方式被调用:
int answer = t(3); // answer is 9
这里是一个完整的例子:
delegate int Converter (int x); class Test { static void Main() { Converter t = Square; // Create delegate instance int result = t(3); // Invoke delegate Console.WriteLine (result); // 9 } static int Square (int x) { return x * x; } }
delegate
实例充当调用者的委托:调用者调用delegate
,然后委托调用目标方法。
委托类似于C函数指针。
一个委托实例可以引用多个目标方法。
+
和 + =
运算符合并了委托实例。
例如:
MyDelegate d = methodB; d += methodA;
调用d现在将调用 methodB
和 methodA
。
将按添加的顺序调用代理。
-
和 -=
运算符从左代表中删除正确的代理操作数操作数。 例如:
d -= methodB;
调用 d
现在将仅调用 methodA
。
我们可以为委托分配一个空值:
MyDelegate d = null; d += methodB; // Equivalent (when d is null) to d = methodB;
如果多播委托具有非void返回类型,则调用者从最后一个要调用的方法接收返回值。
前面的方法仍然被调用,但是它们的返回值被丢弃。
所有委托类型隐含地派生自System.MulticastDelegate
,它继承自 System.Delegate
。
当实例方法分配给委托对象时,委托对象维护方法所属的方法和实例的引用。
System.Delegate
类的Target属性表示此实例。
例如:
public delegate void Printer (int percentComplete); class Test { static void Main() { X x = new X(); Printer p = x.methodA; p(1); Console.WriteLine (p.Target == x); // True Console.WriteLine (p.Method); // Void methodA(Int32) } } class X { public void methodA (int percentComplete) { Console.WriteLine (percentComplete); } }
C# 通用委托委托类型可以包含通用类型参数。例如:public delegate T ConverterT (T arg);有了这个定义,我们可以编写一个适用于...
C#对象初始化任何可访问的字段或对象的属性可以在构造之后通过对象初始化器直接设置。例如,考虑下面的类:public class Person ...