C#委托和事件

最近学习了委托和事件,在网上也找过很多资料,发现很多都是讲的差不多,对初学者来说,很难理解的,自己从网上找了不少列子,总结一下,希望对大家有所帮助

对于概念的介绍,网上很多,大家可以自己去看看,主要是自己也不怎么清楚,这里就给大家直接上手几个例子,这样会比较直观

1.委托

  两个窗体之间的传值,我想这个大家肯定都会遇到,也是一个比较好的案例吧

  form1窗体有个按钮,点击弹出form2窗体,form2窗体上有一个text文本框,点击form2上的按钮,将文本框中的值输出到form1窗体上(用lable接收)

  图片:

  

  

  from1中的代码:

  

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace 委托
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 f2 = new Form2(aa);
            f2.Show();
        }
        public void aa(string name) 
        {
            label1.Text = name;
        }
    }
}

 

  from2中的代码:

  

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace 委托
{

    //声明一个委托  委托的返回值,和参数必须和要传递的函数一样
  //这里要传递的函数就是form1中的aa函数
//委托就是把函数当做参数进行传递 public delegate void Delaa(string name); public partial class Form2 : Form { //声明一个字段,用来存贮传递过来的方法 public Delaa _del; public Form2(Delaa ab) { this._del = ab; InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { _del(textBox1.Text); } } }

 

  总结一下:

   1、委托实际上就是指针,就是方法的地址,程序中你让它指向哪个方法它就指向哪个方法;
    2、委托是统一的方法模型,参数必须一致;
    3、委托实际上是把方法当作参数来传递,可以是静态方法也可以是非静态的方法。

 

2.事件:

  个人感觉要用事件,必须要用到委托,

  废话不多说,直接上代码:写例子,

  列子:定义3个类,一个是将军类,士兵a类,士兵b类

    将军举左手的时候,士兵a攻击,右手的时候,士兵b攻击,摔杯a,b同时攻击

  将军类:

  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 委托2
{

    //声明2个委托
    //委托的命名规则:命名规则是在准备传递的方法名后加上EventHandler,也可以不这样用,只不过大家都这么用
    //第一个委托是有参数的,第二个委托无参数
    public delegate void RaiseEventHandler(string str);
    public delegate void FallEventHandler();

    class Leader
    {
        //将创建的委托与特定的事件关联
        public event RaiseEventHandler RaiseEvent;
        public event FallEventHandler FallEvent;

        public void Raise(string str) 
        {
            Console.WriteLine("首领"+str+"举杯",str);
            if (RaiseEvent != null) 
            {
                RaiseEvent(str);
            }
        
        }

        public void Fall() 
        {
            Console.WriteLine("首领摔杯");
            if (FallEvent != null) 
            {
                FallEvent();
            }
        }

    }
}

  士兵A:

  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 委托2
{
    class SolidA
    {
        //创建将军
        Leader Ld;

        //在构造函数中传递将军类
        public SolidA(Leader ld) 
        {
            //赋值
            this.Ld = ld;
            //创建2个事件对象,2个事件都指定到对应的方法中
            Ld.RaiseEvent += new RaiseEventHandler(S_Att);
            Ld.FallEvent += new FallEventHandler(SumAtt);
        }

        
        public void S_Att(string str) 
        {
            if (str == "左手") 
            {
                attack();
            }
        }

        public void SumAtt() 
        {
            attack();
        }

        public void attack()
        {
            Console.WriteLine("士兵A发动攻击");
            Console.ReadLine();
        }
    }
}

 

 士兵B:

  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 委托2
{
    class SolidB
    {

        //创建将军
        Leader Ld;
        //在构造函数中传递将军类
        public SolidB(Leader ld) 
        {
            //赋值
            this.Ld = ld;
            //创建2个事件对象,2个事件都指定到对应的方法中
            ld.RaiseEvent += new RaiseEventHandler(B_Att);
            ld.FallEvent += new FallEventHandler(Sum_Att);
        }

        public void attack() 
        {
            Console.WriteLine("士兵B发动攻击");
            Console.ReadLine();
        }

        public void B_Att(string str) 
        {
            if (str == "右手") 
            {
                attack();
            }
        }

        public void Sum_Att()
        {
            attack();
        }
    }

}

  在main函数中调用:

  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 委托2
{
    class Program
    {
        static void Main(string[] args)
        {

            Leader ld = new Leader();
            SolidA sa = new SolidA(ld);
            SolidB sb = new SolidB(ld);

            ld.Raise("左手");
            Console.ReadLine();


        }
    }
}

  希望对大家能够有所帮助,不足之处,欢迎大家留言!

 

posted @ 2017-07-21 16:51  青年a  阅读(230)  评论(0编辑  收藏  举报