SimpleDelegate 委托
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
/// <summary>
/// 委托是一类继承自 System.Delegate 的类型,每个委托对象至少包含一个指向某个方法的指针,该方法可以是实例方法,也可以是静态方法,委托实现了回调放方式的机制,能够帮助程序员设计简洁优美的面向对象程序。
/// System.Object
/// system.Delegate - ISerilizable
/// - ICloneable
///syatem.MulticastDelegate
///
///
///
/// 委托回静态方法和实力方法的区别
///
/// 静态方法由 static 关键字定义,静态方法可以通过类名访问而不需要任何实例对象‘在静态方法中不能访问类型中得任何非静态成员
///
/// 实力方法需要通过具体的实例对象访问,可以访问实例对象的任何成员
///
/// 当一个实例方法被绑定到委托,必须同时让委托得到实例方法的代码段和实例对象的信息,这样在委托回调的时候.NET才能执行该实力方法
///
/// system.Delegate 内部结构中有 _target 和 _methodPtr 两个指针。其中,_ target 指向目标实例; _methodptr指向绑定方法。
///
/// 当绑定实例方法时,_target设置为方法所在类型的实例对象;当绑定静态方法时,_target 被设置为 null
///
/// 绑定实例方法和静态方法时,_methodptr都设置为所绑定的方法。
///
///
/// </summary>
///
class SimpleDelegate
{
/// <summary>
/// 定义一个委托
/// </summary>
/// <param name="i">接受一个整型的参数</param>
public delegate void TestDelegate(int i);
/// <summary>
/// 一个静态方法,符合TestDelegate的定义
/// </summary>
/// <param name="i">整型参数</param>
internal static void PrintMessage(int i)
{
Console.WriteLine("第{0}个方法", i);
}
}
class Program
{
static void Main(string[] args)
{
//委托
//实例化委托对象,并且指向PrintMessage 方法
SimpleDelegate.TestDelegate d = new SimpleDelegate.TestDelegate(SimpleDelegate.PrintMessage);
//委托调用方法
//当执行委托时,.NET 检查委托对象并找到 PrintMessage(int i) 方法,然后把参数传递给该方法并执行。
//本质上,委托的调用就是执行在定义委托时所生产的 Invoke的方法
d.Invoke(0);
d.Invoke(1);
//简化程序输入
d(1);
Console.Read();
}
}
}