当前位置:编程学习 > asp >>

.NET Framework 2.0高级编程学习笔记(二):委托与事件

本文内容:
  1.  委托定义
  2.  申明委托
  3. 委托的实例化
  4. 委托的调用
  5. 匿名方法
  6. 委托程序实例
  7. 事件定义
  8. 事件的申明
  9. 事件的调用
  10. 事件订阅与移除
  11. 事件程序实例
  12. 标准化事件的设计

________________________________________


1. 委托定义
委托(Delegate)是C#或者.NET中表示强类型方法的特殊类型。比较接近于C语言中的函数指针。(指向函数入口地址的数据类型)。读到这里说下C语言的两个概念:指针函数和函数指针。
指针函数是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针。
int *fun(x);
 
函数指针是指向函数的指针变量,即本质是一个指针变量。
int (*f) (int x); /* 声明一个函数指针 */

f=function; /* 将function函数的首地址赋给指针f */

 
因此由上面可以看出,委托其实是一种封装好的函数指针。
 
2. 申明委托
申明委托使用delegate关键字,语法是:
[<修饰符>] delegate <返回类型> <委托名> ([<形参表>])
修饰符:new、public、protected、internal、private。如果在namespace下,只能用public,internal 。
返回类型:与方法的返回类型相同
委托名:与其他类型的标识符要求相同,常用handler作后缀
形参表:与方法的形参表的要求相同
举例:delegate void D1(int i, double d);
 
 
3.委托的实例化
由于委托类似方法指针,申明委托时给出的返回类型和形参表,实际上是指该委托所能指向或者封装的方法的返回类型和参数表。
凡是与委托的返回类型和形参表相同的方法,不管是静态的还是实例的,称为与委托的类型兼容,都可以被该委托的实例封装。
委托类型定义后,可以像其他类型一样申明该类型的变量,并对变量实例化。
 
对委托进行实例化的写法为:
   new <委托类型名> (<表达式>)
   这里,表达式可以是一个兼容的静态方法、实例方法、或者一个委托实例。
例如:
delegate void D(int x);    //申明委托

class C

{        public static void M1(int i) {...}

         public void M2(int i) {...}

}

class Test

{        static void Main()

    {        D cd1 = new D(C.M1);     // 用静态方法

                   C t = new C();         // 实例化有关类

                   D cd2 = new D(t.M2);      // 用实例方法

                   D cd3 = new D(cd2);         // 用一个委托实例

         }

}
 

从某个方法创建一个委托实例时,该委托实例将封装此方法,此时,它的调用列表只包含一个进入点。 可用 +和 += 运算符组合委托实例,用 -和 -= 运算符将一个委托从委托组合中移除。
当组合两个或多个非空委托实例时,它们的调用列表被连接在一起(按照左操作数在先、右操作数在后的顺序)以组成一个新的调用列表,它包含了两个或更多个“进入点”。
例如:委托的组合及调用列表
 
delegate void D(int x);

class C

{        public static void M1(int i) {...}

         public static void M2(int i) {...}

}

class Test

{        static void Main()

     {            D cd1 = new D(C.M1);       // M1

                   D cd2 = new D(C.M2);       // M2

                   D cd3 = cd1 + cd2;     // M1 + M2

                   D cd4 = cd3 + cd1;   // M1 + M2 + M1

                   D cd5 = cd4 – cd1;   // M1 + M2

         }

}
 

4.委托的调用
直接使用委托实例名和一组符合要求的参数可以调用该委托。
调用一个委托实例,就是依次调用其调用列表中的方法。使用的是同一组参数。
委托实例可以多次出现在一个调用列表中。这种情况下,它每出现一次,就会被调用一次。从这样的调用列表中移除委托,实际上移除的是调用列表中最后出现的那个委托实例。
 
5.匿名方法
匿名方法是指初始化委托时内联申明的方法。
 
6.委托程序实例
using System;

namespace delegateExam
{
    /// <summary>
    /// Class1 的摘要说明。
    /// </summary>
    delegate void TestDelegate();     //在名称空间下申明委托
    class Class1
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        TestDelegate TD;            //申明委托类型的字段
        [STAThread]
        static void Main(string[] args)
        {
            //
            // TODO: 在此处添加代码以启动应用程序
            //
            TestDelegate TD1 = new TestDelegate(Class1.MethodA);      //在方法中申明委托实例并用静态方法初始化
            TestDelegate TD2 = new TestDelegate(test.method2);          //在方法中申明委托实例并用静态方法初始化
            Class1 aClass1 = new Class1();
            test aTest = new test();
            TD2 += new TestDelegate(aClass1.MethodB);                    //加上实例方法
            TD1 += new TestDelegate(aTest.method1);                        //加上实例方法
            Console.WriteLine("调用委托TD1...");
            TD1();
            Console.WriteLine("调用委托TD2...");
            TD2();
            TD1 += TD2;            &

补充:Web开发 , ASP.Net ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,