C#委托之初识委托

当我刚学习C#是接触事件时,就在思考它是怎样一种机制,直到深入的接触委托对事件有了更深刻的认识,这是一个回到函数,在.NET Framework 中运用的很广泛,如窗体状态变化,菜单选项等等。那有没有思考过它是如何实现的那,这就要说到委托 ,委托是一个类似于C中的函数指针的东西,但C#提供给委托更为安全的类型机制。

下面给大家掩饰一下委托的声明创建和使用:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace MyDelegate

{

    class Program

{

public delegate void   FunBock(int   value);

 

        static void Main(string[] args)

        {

            Program p = new Program();

            StaticDelegate();

            instanceDelegate(p);

            chainDelete(p );

        }

 

        public static  void counter(int from,int tow , FunBock fb)

        {

            for (int i = from; i <= tow; i++)

            {

                if (fb != null)

                    fb(i);

                else return;

            }

        }

 

        // 代理静态方法

        public static void StaticDelegate()

        {

            Console.WriteLine("-------------代理静态函数----------------");

            Program.counter(0,1,null);

            Program.counter(0, 1, new FunBock(Program.StaticFunction ));

            Console.WriteLine();

        }

 

 

        //代理实例方法

        public static void instanceDelegate(Program p )

        {

            Console.WriteLine("------------代理实例方法----------------");

            Program.counter(0, 1, null);

            Program.counter(0, 1, new FunBock(p.ObjectFunction ));

            Console.WriteLine();

        }

 

        //代理串行函数

        public static void chainDelete(Program p )

        {

            Console.WriteLine("------------代理串行函数----------------");

            FunBock fb1 = null;

             fb1 =(FunBock)Delegate.Combine(fb1, new FunBock(p.ObjectFunction));

             fb1 = (FunBock)Delegate.Combine(fb1,new FunBock(Program.StaticFunction));

            Program.counter(0, 1, fb1);

            Console.WriteLine();

 

        }

 

        public void ObjectFunction(int value  )

        {

            Console.WriteLine("ObjectFunction方法 值是:" + value);

        }

 

        private static void StaticFunction(int   value )

        {

            Console.WriteLine("StaticFunction方法 值是:" + value);

        }

 

    }

}

解析:delegate是委托声明,声明指定了一个委托函数的签名。在本例中采用一个int的参数无返回类型的委托,这就声明了所有的无返回类型的有一个int类型参数的所有函数都为它的指向值,类似与类与实例对象的概念,FunBock类,所有满足约束条件的方法都可以看作这个类的实例!

关于chainDelete实现了链式的代理将在委托链中详细讲解!
posted @ 2011-06-20 20:27  王博的园子  阅读(300)  评论(0编辑  收藏  举报