试说明在C#中Delegate类的使用

发布时间:2017-1-17 19:06:23 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"试说明在C#中Delegate类的使用",主要涉及到试说明在C#中Delegate类的使用方面的内容,对于试说明在C#中Delegate类的使用感兴趣的同学可以参考一下。

 试比较在C#中Delegate类的使用============================================================== Delegate类简介------------------------      命名空间:System程序集:mscorlib(在 mscorlib.dll 中)    委托(Delegate)类是一种数据结构,通过它可引用静态方法或引用类实例及该类的实例方法。 以往的界面编程中我们应该都接触过各种类型的事件驱动(event driven)的处理模式,在这种模式里,我们定义相应事件触发的函数。例如:Button1 的 Click事件,我们可以编写Button1_Click 或 Btn1Clicked等函数来做相应的驱动处理。而事件与驱动函数的对应关系就是通过委托(Delegate)类来关联的。 其实委托(Delegate)类这种数据结构有些类似于之前C/C++中的函数指针。 Delegate类一个简单应用------------------------     1.定义一个Delegate函数数据结构2.定义Delegate将引用的静态方法或引用类实例及该类的实例方法3.Delegate数据变量指向实例方法4.通过Delegate数据变量执行实例方法 A very basic example (TestClass.cs): using System; namespace MySample{    class TestClass    {    //1.定义一个Delegate函数数据结构        public delegate void GoDelegate();         [STAThread]        static void Main(string[] args)        {        //3.Delegate数据变量指向实例方法            GoDelegate goDelegate = new GoDelegate( MyDelegateFunc);         //4.通过Delegate数据变量执行实例方法            goDelegate();            return;        }           //2.定义Delegate将引用的静态方法或引用类实例及该类的实例方法        public static void MyDelegateFunc()        {            Console.WriteLine("delegate function...");        }            }} 编译执行结果: # TestClass.exedelegate function... 使用Delegate类和Override实现多态的比较----------------------------------------------- 1.使用Delegate类的时候,下面的例子可以很清楚的说明。  1.1 首先定义一个动物基类(MyAnimalDelegateClass), 基类中有显示属性的(ShowAnimalType)的public方法。      并且在ShowAnimalType方法中调用Delegate引用的实例方法   1.2 定义狮子(LionDelegateClass)和马(HorseDelegateClass)两个子类。Delegate与各自的实例方法绑定      实现不同的属性显示(ShowAnimalType)方法。 ////Delegate example (TestClass.cs): using System; namespace MySample{   class TestClass   {      [STAThread]      static void Main(string[] args)      {      //狮子(LionDelegateClass)的属性显示(ShowAnimalType)方法调用         LionDelegateClass lionDelegate = new LionDelegateClass();         lionDelegate.ShowAnimalType("MySample");       //马(HorseDelegateClass)的属性显示(ShowAnimalType)方法调用         HorseDelegateClass horseDelegate = new HorseDelegateClass();         horseDelegate.ShowAnimalType("MySample");      }   }    //动物基类(MyAnimalDelegateClass)   public class MyAnimalDelegateClass   {      //Delegate数据结构定义      public delegate void DelegateFunction(string strFuncName);       private DelegateFunction m_delegateFunction = null;       //Delegate类型的属性      public DelegateFunction delegateFunction       {         get          {            return m_delegateFunction;         }          set          {            m_delegateFunction = value;         }      }          //属性显示(ShowAnimalType)方法      public void ShowAnimalType(string strFuncName)      {         if (delegateFunction != null)         {            object[] args = {strFuncName};         //调用Delegate引用的实例方法            delegateFunction.DynamicInvoke(args);         }      }   }    //狮子(LionDelegateClass)   public class LionDelegateClass:MyAnimalDelegateClass   {      public LionDelegateClass()      {         this.delegateFunction = new DelegateFunction(subFunction1);      }       //狮子(LionDelegateClass)实例方法的实装      private void subFunction1(string strFuncName)      {         System.Console.WriteLine(            string.Format("[{0}]This is a lion....", strFuncName));      }   }    //马(HorseDelegateClass)   public class HorseDelegateClass:MyAnimalDelegateClass   {      public HorseDelegateClass()      {         this.delegateFunction = new DelegateFunction(subFunction2);      }       //马(HorseDelegateClass)实例方法的实装      private void subFunction2(string strFuncName)      {         System.Console.WriteLine(            string.Format("[{0}]This is a horse....", strFuncName));      }   }} 编译执行结果: # TestClass.exe [MySample]This is a lion....[MySample]This is a horse.... 2.使用Override实装的时候,参考下面的例子。  1.1 首先定义一个动物基类(AbstractAnimalNoDelegateClass), 基类中有显示属性的(ShowAnimalType)的public方法。      并且在ShowAnimalType方法中调用抽象方法(NoDelegateFunction)   1.2 定义狮子(LionNoDelegateClass)和马(HorseNoDelegateClass)两个子类。      子类中实装抽象方法(NoDelegateFunction)      实现不同的属性显示(ShowAnimalType)方法。 ////Override example (TestClass.cs): using System; namespace MySample{   class TestClass   {      [STAThread]      static void Main(string[] args)      {          //狮子(LionNoDelegateClass )的属性显示(ShowAnimalType)方法调用          LionNoDelegateClass lionNoDelegate = new LionNoDelegateClass();       lionNoDelegate.ShowAnimalType("MySample");           //马(HorseNoDelegateClass )的属性显示(ShowAnimalType)方法调用       HorseNoDelegateClass horseNoDelegate = new HorseNoDelegateClass();       horseNoDelegate.ShowAnimalType("MySample");      }   }    //动物基类(AbstractAnimalNoDelegateClass)    public abstract class AbstractAnimalNoDelegateClass    {        public void ShowAnimalType(string strFuncName)        {            //抽象方法(NoDelegateFunction)调用            NoDelegateFunction(strFuncName);        }        //在基类中定义抽象方法(NoDelegateFunction)        protected abstract void NoDelegateFunction(string strFuncName);    }     //狮子(LionNoDelegateClass )    public class LionNoDelegateClass:AbstractAnimalNoDelegateClass    {    // 子类中实装抽象方法(NoDelegateFunction)        protected override void NoDelegateFunction(string strFuncName)        {            System.Console.WriteLine(                string.Format("[{0}]This is a lion....", strFuncName));        }    }       //马(HorseNoDelegateClass )    public class HorseNoDelegateClass:AbstractAnimalNoDelegateClass    {    // 子类中实装抽象方法(NoDelegateFunction)        protected override void NoDelegateFunction(string strFuncName)        {            System.Console.WriteLine(                string.Format("[{0}]This is a horse....", strFuncName));        }    }} 编译执行结果: # TestClass.exe [MySample]This is a lion....[MySample]This is a horse.... 3.比较Delegate和Override实装方式  可以看出Delegate实装方式中,相当于定义一个函数指针的成员变量。  通过把实装函数的地址赋给该成员变量,实现同样的方法,处理方式的不同。  而Override方式中,则是在父类中预先定义好接口,通过实装的不同,  来实现同样的方法,处理方式的不同。  Delegate实装方式比较灵活,适合设计不是很完善的场合,便于修改。  Override方式封装性好,相对比较安全。 MulticastDelegate 类的应用--------------------------------- 在C#中,委托(Delegate)类是多路委托,这就说可以同时指向多个处理函数,并且可以按照委托的先后顺序,执行相应的函数。     如下例:using System; namespace MySample{    class TestClass    {        [STAThread]        static void Main(string[] args)        {            DogDelegateClass dogDelegate = new DogDelegateClass();            dogDelegate.ShowAnimalType("MySample");     }     public class MyAnimalDelegateClass    {        public delegate void DelegateFunction(string strFuncName);         private DelegateFunction m_delegateFunction = null;         public DelegateFunction delegateFunction         {            get             {                return m_delegateFunction;            }             set             {                m_delegateFunction = value;            }        }         public void ShowAnimalType(string strFuncName)        {            if (delegateFunction != null)            {                object[] args = {strFuncName};                 delegateFunction.DynamicInvoke(args);            }        }    }     public class DogDelegateClass:MyAnimalDelegateClass    {        public DogDelegateClass()        {      //多路委托函数 设定            this.delegateFunction =  new DelegateFunction(subFunction31);            this.delegateFunction += new DelegateFunction(subFunction32);        }  //委托函数1        private void subFunction31(string strFuncName)        {            System.Console.WriteLine(                string.Format("[{0}]This is a dog....", strFuncName));        }  //委托函数2        private void subFunction32(string strFuncName)        {            System.Console.WriteLine(                string.Format("[{0}]This is a nice dog....", strFuncName));        }    }} 编译执行结果: # TestClass.exe [MySample]This is a dog....[MySample]This is a nice dog....    

上一篇:新的博客
下一篇:Red Herring杂志采访Linux创始人linus

相关文章

相关评论