C#学习笔记,34——委托传值

说明(2018-4-6 20:31:03):

1. 昨天晚上看三层,看完第一天的最后一节,会员的修改和增加,感觉欲仙欲死,果断关机睡觉。

2. 上午搞了半天哈利波特的原版书epub的下载,结果都没发现一个排版能看的,就连多看卖的正版里面都是字体大小不一,遂决定先把爱丽丝看完再去寻找其他的。

3. 下午2点起床,开始对着电脑冥想,想那个窗体传值怎么弄的来着,拖出两个窗体来,怎么捣鼓都捣鼓不出来,就在这较上劲了,一直想到六点半,吃完我妈擀的面条,又想了一个小时,估计是8点的时候,终于想通了,能够实现传值了。

4. 翻了翻之前的博客,关于委托写了不下十篇了,包括自己写的,从别处抄的。大部分都是讲的委托的基础用法,委托现在在网上已经神乎其神,玄乎其玄,近乎其妖了,怎么讲的都有。然而并没有任何卵用,文章照样看得懂,用的时候照样懵逼。

5. 所以说啊,一个东西你不去实际使用它,就永远不知道怎么用。都说委托是个坎,确实是啊!你不会就只能看会的人装逼,说什么委托其实很简单啊,其实就是个指针嘛,只要理解了就很容易的。。等等屁话。

6. 就是因为不会委托,所以看不下去asp.net,看不下去三层,可以说不会委托,你根本就深入不下去,就好比有一条大河,你要去对岸,就必须要通过委托这座桥,你想直接跳过去是不可能的!

7. 这一下午,我开始一直在想,委托和指针有什么联系,委托是不是存了一个函数的地址?因为之前为了弄清委托原理,我学习了一段时间数据结构,所以老想着往指针上面靠,然后我就去查资料,结果走上了不归路。

8. 在查资料的过程中,看到有人说委托的最大的应用是在设计模式中的观察者模式,于是去找视频,不得不说啊,c#真的是不吃香了,搜设计模式,基本都是Java的,好不容易找到一个讲c#的,讲的是大话设计模式这本书,我手头正好有一本,但是视频里还没讲到委托部分就没了。而且我翻了一下书,里面也只是最基础的运用。我说的基础,就是网上大部分文章介绍的,MyDelegate myDel= SayHello; myDel()这种没有营养的应用。

9. 虽然窗体传值只有几行代码,我却想了6个小时。但当程序实现的那一刻,我的欣喜是难以名状的,甚至现在都还在窃喜,感觉这一天值了。虽然三层里的事件更加复杂,但这也算是入门了吧!

10. 在我最后往代码里加注释的时候,我居然还即兴编出了一个故事!委托被称为代理,但我觉得委托更像是一个间谍!

11. 开始讲故事!

Form1.cs

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

namespace _05窗体传值
{
    //1.定义委托(MyDel就像是Form2的一个间谍,已经潜入到了Form1中)
    public delegate void MyDel(string str);
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //2.绑定委托(间谍mdl拿到了这颗炸弹的遥控器)
            MyDel mdl = ChangeTxt;
            //Form2通过构造方法进行初始化(此时,通过Form2的载人飞船,间谍mdl可以回到Form2基地)
            Form2 f2 = new Form2(textBox1.Text,mdl);
            f2.ShowDialog();
        }
        //定义方法,一会儿好绑定委托(有人在Form1中埋下了一颗炸弹)
        private void ChangeTxt(string str)
        {
            textBox1.Text = str;
        }
    }
}

Form2.cs

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

namespace _05窗体传值
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }
        //Form2派出新的间谍
        private MyDel mdl;
        public Form2(string str,MyDel mdl):this()
        {
            //新派出的间谍,与返回的间谍交接,新间谍拿到遥控器
            this.mdl = mdl;
            textBox1.Text = str;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //3.调用委托(新间谍按下遥控器按钮,BOOM!!!)
            mdl(textBox1.Text);
        }
    }
}

运行结果参考:https://www.cnblogs.com/Jacklovely/p/7886612.html

补充:

1. 以前做这个窗体传值,一直以为委托只能写在Form2里,但实际上写在Form1里也可以,因为委托写在命名空间下面,类的外面,所以只要是在这个命名空间里的,所有地方都可以调用到这个委托!

2. Form1.cs中,可以不用声明一个委托变量来绑定ChangeTxt方法,可以直接把ChangeTxt方法放进Form2的构造函数里传过去,不过为了好理解,以及符合剧情,我还是加上了。

3. 我觉得这个例子很生动,很天纵奇才,希望有人能看懂,哈哈哈!