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();
        }
    }
}

posted @ 2012-05-07 17:54  |▍花舞花落泪 ╮  阅读(132)  评论(0编辑  收藏  举报