C#委托Demo三界面同步

委托

委托(delegate)“一个函数赋值给一个委托变量后,调用这个委托等价于调用那个函数
委托就是能存放符合签名方法指针的容器

  1. 委托是一种数据类型,引用类型,像类一样(可以声明委托类型变量)
  2. 使用委托的时候必须new一个委托对象,即使看到的代码没有new委托对象,编译器也会在编译时
    帮我们new赋值给委托的方法,其实是存储在委托对象中的
  3. 委托(在代码中动态嵌入一个方法)使用的步骤:
    1>定义一个委托类型
    public delegate void form2delegate();
    2>声明一个委托变量
    form2delegate wd=new form2delegate(方法名);
    3>调用委托
    if(wd !=null){
    //调用委托
    wd();
    或wd.Invoke();
    }
  4. 什么情况下用委托?委托有什么用?
    1.有一段代码
    2.变化(当一个类型中需要嵌入一段代码,但是这段代码具有不确定性,是根据使用这个类型的用户来确定代码的,这种情况下就可以在该类型中,使用一个委托,保证在某种情况下调用这个委托,
    这时,用户将对应的方法传递给该委托,则就会调用这个方法)

 自定义控件中的事件会大量使用到委托(写事件的时候会用到委托)
//可以把静态方法或私有方法赋值到委托变量,赋值后能使用到该委托变量的地方
就能使用该方法
–匿名方法: myDelegate md=delegate(){ console…};
调用: md();
public delegate void myDelegate();
–事件 :委托可以实现事件所有功能时代
事件就是委托封装了add和remove方法,不会让别人捣乱 本质还是委托
定义事件之前要定义委托;

public delegate void myTriplechick();
public event myTriplechick Tirpclick;

事件只能使用+=或-=赋值,避免使用=赋值时覆盖问题
/
委托和事件区别:委托是类型,事件是对象,相当于一个委托的变量(可以理解为对委托变量的封装(私有委托)),
委托可以在外部调用,可以用=号赋值,事件只能在定义事件的内部来调用,只能用+=或-=赋值,委托可以实现件的所有功能,事件相对于对委托做了一个限制。
/
事件作用与委托变量一样。
–程序集(exe,dll):类型元数据(代码中每一个类型和成员),程序集元数据(程序集清单),IL代码,资源文件
可以通过Assmblyinfo.cs文件来定义

namespace 委托
{
    class Program
    {
        public delegate void DGSay();//声明委托类
        public delegate void DGsay2(string msg);
        static void Main(string[] args)
        {
            DGSay saydelegate = new DGSay(say);//方法放进去
            saydelegate();
            DGsay2 say2delegat = new DGsay2(say2);
            say2delegat("11");
            Console.ReadKey();

        }
        static void say() 
        {
           Console.WriteLine("你好");
        }
        static void say2(string msg)
        {
            Console.WriteLine(msg);
        }
    }
}

三界面同步Demo

委托当参数

         //定义委托,它定义了可以代表的方法的类型  
    public delegate void GreetingDelegate(string name);  
    class Program {  
        private static void EnglishGreeting(string name) {  
               Console.WriteLine(”Morning, ” + name);  
        } Www~  
        private static void ChineseGreeting(string name) {  
               Console.WriteLine(”早上好, ” + name);  
        }   
        //注意此方法,它接受一个GreetingDelegate类型的方法作为参数  
        private static void GreetPeople(string name, GreetingDelegate MakeGreeting) {  
               MakeGreeting(name);  
        }  
        static void Main(string[] args) {  
               GreetPeople(”Jimmy Zhang”, EnglishGreeting);  
               GreetPeople(”张子阳”, ChineseGreeting);  
               Console.ReadKey();  
        }  
    }  
  }

定义事件

namespace 最简单的自定义事件
{
     /// <summary>
     /// 事件发送类
     /// </summary>
     class Class1
     {
         public delegate void UserRequest(object sender,EventArgs e); //定义委托
         public event UserRequest OnUserRequest; //定义一个委托类型的事件
         public void run()
         {
             while(true)
             {
                 if(Console.ReadLine()=="a")
                 {//事件监听
                     OnUserRequest(this,new EventArgs()); //产生事件
                 }
             }
         }
     }

     /// <summary>
     /// 事件接收类
     /// </summary>
     class Class2
     {
         static void Main(string[] args)
         {
             Class1 c1 = new Class1();
             c1.OnUserRequest += new Class1.UserRequest(c1_OnUserRequest); //委托实例化后绑定到事件
             c1.run();
         }

         private static void c1_OnUserRequest(object sender, EventArgs e)
         {//事件处理方法
             Console.WriteLine("/t你触发了事件!");
         }
     }
}


namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            person p = new person();
            p.hello += new person.say(p_hello);
            p.run();
            Console.ReadKey();
        }

        static void p_hello()
        {
            Console.WriteLine("11");
        }


    }
    class person {
        public delegate void say();
        public event say hello;
        public void run() {
            hello();
        }
    }
}  

Form1

   private void btnForm2_Click(object sender, EventArgs e)
        {
            Form2 form2 = new Form2();
            form2.Show();
        }

        private void btnForm3_Click(object sender, EventArgs e)
        {
            Form3 form3 = new Form3();
            form3.Show();
        }
        public delegate void ColorDelegate(string color);
        public static ColorDelegate ColorChange = null;
        private void cbColor_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (ColorChange != null) {
                ColorChange(this.cbColor.Text);
            }
        }

Form2

   private void Form2_Load(object sender, EventArgs e)
        {
            Form1.ColorChange += delegate(string color)
            {
                switch (color)
                {
                    case "red": this.BackColor = Color.Red; break;
                    case "black": this.BackColor = Color.Black; break;
                    case "blue": this.BackColor = Color.Blue; break;
                };
            };
        }

Form3

  private void Form3_Load(object sender, EventArgs e)
        {
            Form1.ColorChange += delegate(string color)
            {
                switch (color)
                {
                    case "red": this.BackColor = Color.Red; break;
                    case "black": this.BackColor = Color.Black; break;
                    case "blue": this.BackColor = Color.Blue; break;
                };
            };
        }

目录