C#委托

委托是一个类型安全的对象,它指向程序中另一个以后会被调用的方法,委托类型包含3个重要的信息:它所调用的方法的名称;该方法的参数(可选);该方法的返回值(可选)。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace SimpleDelegate
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

}
//这个委托可以指向任何传入两个整数并返回一个整数的方法
public delegate int BinaryOp(int x,int y);
//这个类包含了BinaryOp将指向的方法
public class SimpleMath
{
public static int Add(int x, int y)
{ return x + y; }
public static int Subtract(int x, int y)
{ return x - y; }
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("....Simple Delegate Example...\n");
//创建一个指向SimpleMath.Add()方法的BinaryOp对象
BinaryOp b = new BinaryOp(SimpleMath.Add);
//使用委托间接调用Add()方法
Console.WriteLine("10+10 is {0}", b(10, 10));
Console.WriteLine("sfasf");
Console.ReadLine();
}
}
}

尽管C#不需要我们在代码中显示调用Invoke(),但是我们也完全可以这么做,因此,如下代码语句是可行的:Console.WriteLine("10 + 10 is {0}",b.Invoke(10,10));.Net委托时类型安全的,如果读者试图将一个不“匹配模式”的方法传入委托,将会收到编译期错误。

当C#编译期处理委托类型时,它先自动产生一个派生自System.MulticastDelegate的密封类,这个类与它的基类System.Delegate一起为委托提供必要的基础设施,以维护以后将要调用方法的列表。

委托对象

在我们的Program类型中创建一个名为DisplayDelegateInfo()的静态方法,该方法输出由传入的委托类型所维护的方法的名称和定义该方法的类的名称,通过跌太由GetInvocationList()返回的System.Delegate数组,调用每个对象的Target和Method属性。

static void DisplayDelegateInfo(Delegate delObj)          {              //输出委托调用列表中每个成员的名称              foreach (Delegate d in delObj.GetInvocationList())              {                  Console.WriteLine("Method Name:{0}", d.Method);                  Console.WriteLine("Type Name:{0}", d.Target);              }          }

修改Add()和Subtract()方法为非静态的,将能创建SimpleMath类型的一个实例,并如下所示通过对象引用来指定调用的放大:

static void Main(string[] args)         {             Console.WriteLine("....Simple Delegate Example...\n");             //创建一个指向SimpleMath.Add()方法的BinaryOp对象             //BinaryOp b = new BinaryOp(SimpleMath.Add);              //.Net委托也可以指向实例方法             SimpleMath m = new SimpleMath();             BinaryOp b = new BinaryOp(m.Add);              //显示这儿对象的信息             DisplayDelegateInfo(b);             //使用委托间接调用Add()方法             Console.WriteLine("10+10 is {0}", b(10, 10));             Console.ReadLine();         }

编译期会将委托转换为一个完整的类定义,所以将委托定义在使用它的类型作用域里实际上是在该类中创建了嵌套的类。

原文地址:https://www.cnblogs.com/ttssrs/p/2396532.html