委托和事件浅解

一、委托
委托实际上就是C++里面的函数指针,你可以让这个指针指向委托定义时所声名的那种类型的函数。举个例子:

public delegate void 连接数据库委托();
表示:声名一个委托类型,这个委托叫“连接数据库委托”,它所能指向的函数都是返回值为void型,没有参数的函数。比如:
private void 连接Oracle数据库();
private void 连接SqlServer数据库();

我们现在的程序里面要根据用户设定的数据库类型,自动连接数据库。
程序里面可以这么写:
连接数据库委托 委托实例 = null;

(目标数据库类型)
{
   数据库类型.Oracle数据库:
    委托实例 += 连接数据库委托(连接Oracle数据库);
    ;
   数据库类型.SqlServer数据库:
    委托实例 += 连接数据库委托(连接SqlServer数据库);
    ;
}


委托实例(); //运行委托所指向的函数
这里就能根据上面的switch来执行相应的连接数据库函数了。

委托是种类型,所以跟其他类型一样,可以当参数传递。

委托还有一个重要特性就是多播(Multicasting)

就是说执行一个委托实例的时候,可以同时执行一个以上的函数。

比如说我的程序要连接Oracle数据库,同时还要连接SqlServer数据库,可以这么写:
委托实例 += new 连接数据库委托(连接Oracle数据库);
委托实例 += new 连接数据库委托(连接SqlServer数据库);

委托实例(); //运行委托所指向的函数
这样就同时执行了两个函数


二、委托例子的完整代码

System;
System.Threading;

ConsoleApp_CS
{
   AppClass
  {
     连接数据库委托();

     连接Oracle数据库()
    {
      Console.WriteLine();
    }

     连接SqlServer数据库()
    {
      Console.WriteLine();
    }

     Main()
    {
      连接数据库委托 数据库连接;

      数据库连接 = 连接数据库委托(连接Oracle数据库);

      Console.WriteLine();
      数据库连接();  

      数据库连接 = 连接数据库委托(连接SqlServer数据库);

      Console.WriteLine();
      数据库连接();  

      数据库连接 = ;

      数据库连接 += 连接数据库委托(连接Oracle数据库);
      数据库连接 += 连接数据库委托(连接SqlServer数据库);

      Console.WriteLine();
      数据库连接();

      Console.Read();
    }
  }
}




三、事件
可以这么理解:当某件事发生的时候,会有一个广播信号,告诉大家什么事情发生了。某些人可能不关心股票事件,有些人不关心其他国家发洪水事件。这样事件就需要订阅,你只订阅你感兴趣的事件。当事件发生时,那些订阅该事件的订阅者就会收到一个信号,告诉你这个事件发生了。你可以对这个事件不闻不问,这个跟没订阅该事件一样,有些人会对这个事件进行一些处理,比如:
公司饮水机在我旁边,我关心饮水机是否没水了,所以我订阅一个“饮水机没水了”这个事件。
公司饮水机.饮水机没水了 += new 公司饮水机.饮水机没水了委托(我.换水);

这样,当饮水机没水了事件触发时,我就被通知要换水,执行的是“我”这个实例的“换水”方法。
饮水机Class 看起来大概是这样的:
  饮水机
{
   水量 = ;
   饮水机没水了委托();
   饮水机没水了委托 饮水机没水了;

   出水( 出水量)
  {
    Console.WriteLine();
    水量 -= 出水量;
    Console.WriteLine(, 水量);
    (水量 == )
    {
      当饮水机没水了();
    }
  }

   当饮水机没水了()
  {
    (饮水机没水了 != )
    {
       Console.WriteLine();
       饮水机没水了();  
     }
  }
}


而公司员工Class 看起来大概是这样的:
  公司员工
{
   换水()
  {
    Console.WriteLine();
  }
}


Main函数里应该这样

饮水机 公司饮水机 =  饮水机();
公司员工 我 = 公司员工();

公司饮水机.饮水机没水了 += 饮水机.饮水机没水了委托(我.换水);

( i=; i<; i++)
{
  公司饮水机.出水();
  Thread.Sleep();
}

Console.Read();


要注意的一点是:在“当饮水机没水了”函数内,应该判断“饮水机没水了”是否为null,否则就不要执行“饮水机没水了();”


四、事件例子的完整代码

System;
System.Threading;

ConsoleApp_CS
{
   饮水机
  {
     水量 = ;
     饮水机没水了委托();
     饮水机没水了委托 饮水机没水了;

     出水( 出水量)
    {
      Console.WriteLine();
      水量 -= 出水量;
      Console.WriteLine(, 水量);
      (水量 == )
      {
        当饮水机没水了();
      }
    }

     当饮水机没水了()
    {
      (饮水机没水了 != )
      {
        Console.WriteLine();
        饮水机没水了();  
      }
    }
  }

   公司员工
  {
     换水()
    {
      Console.WriteLine();
    }
  }


   AppClass
  {
     Main()
    {
      饮水机 公司饮水机 = 饮水机();
      公司员工 我 = 公司员工();

      公司饮水机.饮水机没水了 += 饮水机.饮水机没水了委托(我.换水);

      ( i=; i<; i++)
      {
        公司饮水机.出水();
        Thread.Sleep();
      }

      Console.Read();
    }
  }
}

转载于:https://www.cnblogs.com/BoKeRen/archive/2006/03/09/346200.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值