說明(2018-4-6 20:31:03): html
1. 昨天晚上看三層,看完第一天的最後一節,會員的修改和增長,感受欲仙欲死,果斷關機睡覺。c#
2. 上午搞了半天哈利波特的原版書epub的下載,結果都沒發現一個排版能看的,就連多看賣的正版裏面都是字體大小不一,遂決定先把愛麗絲看完再去尋找其餘的。設計模式
3. 下午2點起牀,開始對着電腦冥想,想那個窗體傳值怎麼弄的來着,拖出兩個窗體來,怎麼搗鼓都搗鼓不出來,就在這較上勁了,一直想到六點半,吃完我媽擀的麪條,又想了一個小時,估計是8點的時候,終於想通了,可以實現傳值了。數據結構
4. 翻了翻以前的博客,關於委託寫了不下十篇了,包括本身寫的,從別處抄的。大部分都是講的委託的基礎用法,委託如今在網上已經神乎其神,玄乎其玄,近乎其妖了,怎麼講的都有。然而並無任何卵用,文章照樣看得懂,用的時候照樣懵逼。asp.net
5. 因此說啊,一個東西你不去實際使用它,就永遠不知道怎麼用。都說委託是個坎,確實是啊!你不會就只能看會的人裝逼,說什麼委託其實很簡單啊,其實就是個指針嘛,只要理解了就很容易的。。等等屁話。函數
6. 就是由於不會委託,因此看不下去asp.net,看不下去三層,能夠說不會委託,你根本就深刻不下去,就比如有一條大河,你要去對岸,就必需要經過委託這座橋,你想直接跳過去是不可能的!學習
7. 這一下午,我開始一直在想,委託和指針有什麼聯繫,委託是否是存了一個函數的地址?由於以前爲了弄清委託原理,我學習了一段時間數據結構,因此老想着往指針上面靠,而後我就去查資料,結果走上了不歸路。字體
8. 在查資料的過程當中,看到有人說委託的最大的應用是在設計模式中的觀察者模式,因而去找視頻,不得不說啊,c#真的是不吃香了,搜設計模式,基本都是Java的,好不容易找到一個講c#的,講的是大話設計模式這本書,我手頭正好有一本,可是視頻裏還沒講到委託部分就沒了。並且我翻了一下書,裏面也只是最基礎的運用。我說的基礎,就是網上大部分文章介紹的,MyDelegate myDel= SayHello; myDel()這種沒有養分的應用。this
9. 雖然窗體傳值只有幾行代碼,我卻想了6個小時。但當程序實現的那一刻,個人欣喜是難以名狀的,甚至如今都還在竊喜,感受這一天值了。雖然三層裏的事件更加複雜,但這也算是入門了吧!spa
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); } } }
運行結果參考:http://www.javashuo.com/article/p-qhrxtssl-dg.html
補充:
1. 之前作這個窗體傳值,一直覺得委託只能寫在Form2裏,但實際上寫在Form1裏也能夠,由於委託寫在命名空間下面,類的外面,因此只要是在這個命名空間裏的,全部地方均可以調用到這個委託!
2. Form1.cs中,能夠不用聲明一個委託變量來綁定ChangeTxt方法,能夠直接把ChangeTxt方法放進Form2的構造函數裏傳過去,不過爲了好理解,以及符合劇情,我仍是加上了。
3. 我以爲這個例子很生動,很天縱奇才,但願有人能看懂,哈哈哈!