.NET委托的理解

  委托是一种引用方法的类型,是对方法的一种抽象,封装。当处理一件事,而又不明了该事件的具体处理过程时就可以用到委托,它在效果上类似于接口类。
  委托的使用:
   1.委托的申明  委托的申明和函数的申明一样,只是在返回类型前面加上关键字public delegate  string delegateName(parType parameterName)
   2.创建委托的实例   public delegateName  name=new delegateName(AccessFunction(parType parameterName))
   3.处理的方法签名应与委托的签名的返回值及参数一致。
   .NET委托的特点:

  • 委托类似于 C++ 函数指针,但它是类型安全的
  • 委托允许将方法作为参数进行传递
  • 委托可用于定义回调方法
  • 委托可以链接在一起;例如,可以对一个事件调用多个方法。
  • 方法不需要与委托签名精确匹配(参照:协变与逆变)
   网上经典例子:
  
老板手下有两个员工,小张和小王。
老板命令小王,如果小张玩游戏,则小王扣去小张500元钱。
这就是现实中的委托。
小张玩游戏是一个方法,小张还有一个游戏事件,他玩游戏激发这个事件。而小王就是事件处理对象,他负责把小张的钱扣除500。

所以,委托有如下几个要素:
1  激发事件的对象 -- 就是小张
2  处理对象事件的对象 -- 就是小王
3  定义委托,就是你让小王监视小张。

如果这三个要素都满足的话,则你就写出了一个完整事件的处理。

下面有个例子:在vs.net2003 C#控制台应用程序编辑运行成功:

using  System;

namespace  CSharpConsole
{
      
public class 场景
      
{
          [STAThread]
          
public static void Main(string[] args)
          
{
              Console.WriteLine(
"场景开始了.");
              
// 生成小王
              小王 w = new 小王();
              
// 生成小账
              小张 z = new 小张();

              
// 指定监视
              z.PlayGame += new PlayGameHandler(w.扣钱);
   
              
// 开始玩游戏
              z.玩游戏();

              Console.WriteLine(
"场景结束");
              Console.ReadLine();
          }

      }




      
// 负责扣钱的人
      public class 小王
      
{
          
public 小王()
          
{
              Console.WriteLine(
"生成小王");
          }


          
public void 扣钱(object sender,EventArgs e)
          
{
              Console.WriteLine(
"小王:好小子,上班时间胆敢玩游戏");
              Console.WriteLine(
"小王:看看你小子有多少钱");
              小张 f 
= (小张)sender;
              Console.WriteLine(
"小张的钱: " + f.钱.ToString());
              Console.WriteLine(
"开始扣钱");
              System.Threading.Thread.Sleep(
500);
              f.钱 
= f.钱 - 500;
              Console.WriteLine(
"扣完了.现在小张还剩下:" + f.钱.ToString());
          }

      }


      
// 如果玩游戏,则引发事件
      public class 小张
      
{
          
// 先定义一个事件,这个事件表示“小张”在玩游戏。
          public event PlayGameHandler PlayGame;
          
// 保存小张钱的变量
          private int m_Money;

          
public 小张()
          
{
              Console.WriteLine(
"生成小张.");
              m_Money 
= 1000// 构造函数,初始化小张的钱。
          }


          
public int 钱 // 此属性可以操作小张的钱。
          {
              
get
              
{
                  
return m_Money;
              }

              
set
              
{
                  m_Money 
= value;
              }

          }


          
public void 玩游戏()
          
{
              Console.WriteLine(
"小张开始玩游戏了..");
              Console.WriteLine(
"小张:CS好玩,哈哈哈! 我玩..");
              System.Threading.Thread.Sleep(
500);
              System.EventArgs e 
= new EventArgs();
              OnPlayGame(e);
          }


          
protected virtual void OnPlayGame(EventArgs e)
          
{
              
if(PlayGame != null)
              
{
                  PlayGame(
this,e);
              }

          }

      }


      
// 定义委托处理程序

转载于:https://www.cnblogs.com/koolay/articles/1122837.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值