一直都聽說C#中的委托與事件非常重要,都沒有什麼切身的體會,而這次通過做一個WinForm二次開發的項目才真正感覺到了委托與事件的犀利之處。
1.C#中的事件和委托的作用?
事件代表一個組件能夠被關注的一種信號,委托是可以把一個過程封裝成變量進行傳遞並且執行的對象。
2.他們之間的關系?
委托是一種類型,事件是一種成員,就相當於public int Age {get;set;}這個屬性中,int就是類型,Age是一個成員,public event EventHandler Push;這個事件中EventHandler就是委托類型,Push是事件,他是一個成員。
事件從本質上來說是委托,不過在使用上比委托多了一個限制:事件只能在定義事件的類內部被調用,而委托可以在任意方法中被調用(難就難在理解這句)。
我們基本上可以說:事件是委托,委托是方法指針,在調用委托的時候跟調用方法是一樣的。一般來說,這個限制正好用在封裝組件類的時候體現了封裝特性。
3.和什麼情況使用委托和事件?
事件是組件中的抽象概念,同樣包括狀態和操作也是組件中的概念,對應到C#裡面就是屬性和方法。所以像控件之類的組件都會有事件。而委托代表一個代碼的執行過程,C#3.0引入linq以後,用的就非常頻繁了。
4.但是用事件的方式來調用的話有什麼好處?
事件是一種封裝,就好像屬性會封裝字段一樣,可以把定義和實現隔離開來,給你舉個例子就是DateTime實際上你看那麼多屬性,其實裡面只有一個字段存儲時間,各種日期啊年啊屬性都是根據這個時間算出來的。事件也把內部類型為一個委托的字段封裝起來,這樣在類的外部就只能使用事件來注冊或者注銷事件關注,而不能引發事件。
實例: 我們要達到這樣的效果:
就是點擊Form3中的數字選框時使Form1中的文本框聯動
那麼可以使用委托來完成:
第一步:在Form3.cs中定義委托與事件:
//定義帶參數的委托與兩個事件 //這是委托與事件的第一步 public delegate void Form2Handle(string s); public event Form2Handle changed;
第二步:在Form1.cs中將方法注冊到委托上:
//改變值的事件 private void changed(string s) { //此處是給原有窗體中控件賦值 this.textBox1.Text = s + s; } private void button2_Click(object sender, EventArgs e) { Form3 frm3 = new Form3(); //這是委托與事件的第二步, //寫到+=時,按兩次Tab鍵會自動生成frm2_changed,frm3_empty兩個事件 frm3.changed += new Form3.Form2Handle(changed);//改變值的事件 frm3.ShowDialog(); }
第三步:在Form3.cs中使用委托:
//這是委托與事件的第三步 //傳值 changed(numericUpDown1.Value.ToString());
代碼下載:委托與事件實例.rar