委托与事件,关于委托的精彩解说

2019-09-29 15:31 来源:未知

举例多个合营社,你是主管,手下有多个职工,小张和小王。

主  题: “.net百题问答的位移”--过多个人问过的--《 C#委托及事件 》
作  者: 汤姆马克斯 (笑望人生)
出         处:CSDN community (原地点不详)

你命令小王,假设小张玩游戏,则小王扣去小张500元钱。
那就是有血有肉中的委托。
实在,在写程序中,程序猿正是高管,小张和小王正是三个指标。小张玩游戏是二个方法,小张还大概有三个玩耍事件,他玩游戏激发那个事件。而小王正是事件管理对象,他负责把小张的钱扣除500。
于是,委托有如下几个因素:
1 激发事件的对象--就是小张
2 管理目的事件的对象--正是小王
3 定义委托,正是您让小王监视小张。
纵然那四个因素都满足的话,则你就写出了一个一体化事件的管理。
上边有个例子:在vs.net二零零四C#调控台应用程序编辑运营成功:
using System;
namespace CSharpConsole
{
  public class 场景
  {
    [STAThread]
    public static void Main(string[] args)
    {
      Console.WriteLine("场景开首了....");
      // 生成小王
      小王 w = new 小王();
      // 生成小账
      小张 z = new 小张();

有不胜枚举人问的,.Net中的委托以及事件管理。作者拿轻便的例证说美赞臣(Meadjohnson)下,是有血有肉中的例子:

第三个例子

     // 钦命监视

比方叁个小卖部(场景),你是业主,手下有多少个职员和工人,小张和小王。
你命令小王,假诺小张玩游戏,则小王扣去小张500元钱。


思归给的信托事件参照他事他说加以考察站点

      z.PlayGame = new PlayGameHandler;
      // 起首玩游戏
      z.玩游戏();
      console.writeline("场景甘休...");
      Console.ReadLine();
    }
  }

那正是有血有肉中的委托。

public delegate void EatEventHandler(object sender, EatEventArgs e); 
以此的定义也足以不要那样.能够一向就定义二个参数
public delegate void Eat伊芙ntHandler(string e); 但然用的时候的参数要相对应好哦

  // 担任扣钱的人
  public class 小王
  {
    public 小王()
    {
      Console.WriteLine("生成小王...");
    }
    public void 扣钱(object sender,EventArgs e)
    {

实际,在写程序中,程序员正是COO,小张和小王正是七个目的。小张玩游戏是贰个办法,小张还应该有贰个游玩事件,他玩游戏激发这一个事件。而小王就是事件处理对象,他担任把小张的钱扣除500。

using System;

      Console.WriteLine("小王:好小子,上班时间胆敢玩游戏...");

于是,委托有如下多少个因素:
1 激发事件的靶子--就是小张
2 管理对象事件的指标--就是小王
3 定义委托,正是你让小王监视小张。

namespace nsEventSample 

    /// <summary> 
    /// 类EatEventArgs 必得一连自类伊夫ntArgs,用来诱惑风云时包装数据 
    /// </summary> 
    public class EatEventArgs : EventArgs 
    { 
        public String restrauntName;     //酒馆名称 
        public decimal moneyOut;            //希图花费金额 
    }

      Console.WriteLine("小王:看看你小子有个别许钱...");
      小张 f = sender;
      Console.WriteLine("小张的钱: " f.钱.ToString;
      Console.WriteLine("开始扣钱......");
      System.Threading.Thread.Sleep;
      f.钱 = f.钱 - 500;
      Console.WriteLine("扣完了....今后小张还剩余:"

只要那四个要素都满足的话,则你就写出了三个一体化事件的管理。

    /// <summary> 
    /// 这几个委托用来验证拍卖吃饭事件的点子的方法头(形式) 
    /// </summary> 
    public delegate void EatEventHandler(object sender, EatEventArgs e);

  • f.钱.ToString;
        }
      }
      // 如若玩游戏,则吸引事件
      public class 小张
      {
        // 先定义八个事件,那么些事件代表“小张”在玩游戏。
        public event PlayGameHandler PlayGame;
        // 保存小张钱的变量
        private int m_Money;
        public 小张()
        {
          Console.WriteLine("生成小张....");
          m_Money = 10000; // 构造函数,开头化小张的钱。
        }
        public int 钱 // 此属性能够操作小张的钱。
        {
          get
          {
            return m_Money;
          }
          set
          {
            m_Money = value;
          }
        }
        public void 玩游戏()
        {
          Console.WriteLine("小张发轫玩游戏了.....");
          Console.WriteLine("小张:CS好玩,哈哈哈! 我玩.....");
          System.Threading.Thread.Sleep;
          System.EventArgs e = new EventArgs();
          //OnPlayGame;
          if(PlayGame != null)
          {
            PlayGame;
          }
        }
        protected virtual void OnPlayGame(EventArgs e)
        {
          if(PlayGame != null)
          {
            PlayGame;
          }
        }
      }
      // 定义委托管理程序
      public delegate void PlayGameHandler(object sender,System.EventArgs e);
    }

下边有个例子:在vs.net二零零一 C#调整台应用程序编辑运营成功:
using System;

    /// <summary> 
    /// 引发吃饭事件(EateEvent)的类Master(主人),那一个类必得 
    /// 1.扬言三个名称叫EatEvent的平地风波: public event Eat伊芙ntHandler EatEvent; 
    /// 2.透过多个名叫OnEat伊夫nt的议程来诱惑吃饭事件,给那多少个管理那一件事件的措施传数据; 
    /// 3.表明在某种景况下掀起平地风波呢?在饿的时候。用艺术Hungrg来模拟。 
    /// </summary> 
    public class Master 
    { 
        //申明事件 
        public event EatEventHandler EatEvent;

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

        //引发事件的方法 
        public void OnEatEvent(EatEventArgs e) 
        { 
            if (EatEvent != null) 
            { 
                EatEvent(this, e); 
            } 
        }

// 钦赐监视
z.PlayGame = new PlayGameHandler(w.扣钱);

        //当主人饿的时候,他会钦定吃饭地点和成本金额。 
        public void Hungry(String  restrauntName, decimal moneyOut) 
        { 
            EatEventArgs e = new EatEventArgs(); 
            e.restrauntName = restrauntName; 
            e.moneyOut = moneyOut;

// 最早玩游戏
z.玩游戏();

            Console.WriteLine("主人说:"); 
            Console.WriteLine("我饿了,要去{0}吃饭,消费{1}元", e.restrauntName, e.moneyOut);

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

            //引发事件 
            OnEatEvent(e); 
        } 
    }

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

    /// <summary> 
    /// 类Servant(仆人)有二个主意ArrangeFood(安顿食品)来拍卖主人的用餐事件 
    /// </summary> 
    public class Servant 
    { 
        public void ArrangeFood(object sender, EatEventArgs e) 
        { 
            Console.WriteLine(); 
            Console.WriteLine("仆人说:"); 
            Console.WriteLine("笔者的主人, 您的一声令下是 : "); 
            Console.WriteLine("吃饭地方 -- {0}", e.restrauntName); 
            Console.WriteLine("准备花费 -- {0}元 ", e.moneyOut); 
            Console.WriteLine("好的,正给您安插。。。。。。。。"); 
            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());
}
}

    /// <summary> 
    /// 类God安顿qinshihuang(赵正)的雇工是lisi(李通古),并让李斯的ArrangeFood 
    /// 方法来拍卖qinshihuang的就餐事件:qinshihuang.Eat伊芙nt = new Eat伊夫ntHandler(lishi.ArrangeFood); 
    /// </summary> 
    public class God 
    { 
        public static void Main() 
        { 
            Master  qinshihuang = new Master(); 
            Servant lishi = new Servant();

// 假设玩游戏,则抓住平地风波
public class 小张
{
// 先定义三个风云,这么些事件表示“小张”在玩游戏。
public event PlayGameHandler PlayGame;
// 保存小张钱的变量
private int m_Money;

            qinshihuang.EatEvent = new EatEventHandler(lishi.ArrangeFood); 
             
            //秦始皇饿了,想去Hilton大酒馆,消费四千元 
            qinshihuang.Hungry("Hilton大旅馆", 四千.0m); 
        } 
    } 
}   

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

底三个例证

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);
}

例如说一个公司(场景),你是老总娘,手下有三个职员和工人,小张和小李。你命令小张注意小李,在开荒软件职业的时候如若上网打游戏,你就记录下来,从小李薪给里扣100元钱。那一个其实正是具体中的委托。

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

今天交付一个代码,C#调整台程序,编写翻译运维通过
using System;

// 定义委托管理程序
public delegate void PlayGameHandler(object sender,System.EventArgs e);

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);
   }
  }
 }

 // 定义委托管理程序
 public delegate void PlayGameHandler(object sender,System.EventArgs e);
}

深信您看完了后.柳暗花明了吧.HOHO!

 

版权声明:本文由韦德娱乐1946_韦德娱乐1946网页版|韦德国际1946官网发布于网络编程,转载请注明出处:委托与事件,关于委托的精彩解说