C#的事件、委托测试(一) http://www.skcircle.com/?id=1853
C#的事件、委托测试(二) http://www.skcircle.com/?id=1854
C#的事件、委托测试(三) http://www.skcircle.com/?id=1820
勇哥注:
事件委托的小练习,大家不要轻视这些基本功哦。
第一个程序
这是个传统的写法,GreetPeople必须使用switch来判断调用下面哪个版本。
EnglishGreeting
ChineseGreeting
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 WindowsFormsApp1 { public partial class Form1 : Form { public enum Language { English, Chinese } public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { GreetPeople("lxy", Language.Chinese); } public void GreetPeople(string name, Language lang) { //做某些额外的事情,比如初始化之类,此处略 switch (lang) { case Language.English: EnglishGreeting(name); break; case Language.Chinese: ChineseGreeting(name); break; } } public void EnglishGreeting(string name) { Console.WriteLine("Morning, " + name); } public void ChineseGreeting(string name) { Console.WriteLine("早上好, " + name); } } }
第二个程序:
我们的目标是消灭掉Switch,除了EnglishGreeting,ChineseGreeting两个版本,如果之后有其它语言版本也可以让GreetPeople适应,不必要修改代码。
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 WindowsFormsApp1 { public partial class Form1 : Form { public enum Language { English, Chinese } public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { GreetPeople("lxy1", EnglishGreeting); GreetPeople("lxy2", ChineseGreeting); GreetingDelegate deg1, deg2; deg1 = EnglishGreeting; deg2 = ChineseGreeting; GreetPeople("lxy3", deg1); GreetPeople("lxy4", deg2); deg1 = EnglishGreeting; deg1 += ChineseGreeting; GreetPeople("lxy5", deg1); GreetingDelegate deg3 = new GreetingDelegate(EnglishGreeting); deg3 += ChineseGreeting; GreetPeople("lxy6", deg3); //这里GreetingDelegate必须有参数 //GreetingDelegate deg4 = new GreetingDelegate(); //deg4 += ChineseGreeting; deg3 -= ChineseGreeting; GreetPeople("lxy7", deg3); } public delegate void GreetingDelegate(string name); public void GreetPeople(string name, GreetingDelegate MakeGreeting) { MakeGreeting(name); } public void EnglishGreeting(string name) { Console.WriteLine("Morning, " + name); } public void ChineseGreeting(string name) { Console.WriteLine("早上好, " + name); } } }
第三个程序
我们的目标是:分类
让GreetPeople 在一个类中,ChineseGreeting和 EnglishGreeting 在另外的类中。
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 WindowsFormsApp2 { public delegate void GreetingDelegate(string name); public partial class Form1 : Form { public Form1() { InitializeComponent(); } public void EnglishGreeting(string name) { Console.WriteLine("Morning, " + name); } public void ChineseGreeting(string name) { Console.WriteLine("早上好, " + name); } private void button1_Click(object sender, EventArgs e) { GreetingDelegate deg1; deg1 =EnglishGreeting; deg1 +=ChineseGreeting; new c1().GreetPeople("lxy1", deg1); } } public class c1 { public void GreetPeople(string name, GreetingDelegate MakeGreeting) { MakeGreeting(name); } } }
第4个程序:
我们的目的:用面向对象的封装,将GreetingDelegate deg1封装到c1类。
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 WindowsFormsApp3 { public delegate void GreetingDelegate(string name); public partial class Form1 : Form { public Form1() { InitializeComponent(); } public void EnglishGreeting(string name) { Console.WriteLine("Morning, " + name); } public void ChineseGreeting(string name) { Console.WriteLine("早上好, " + name); } private void button1_Click(object sender, EventArgs e) { var f = new c1(); f.deg1 = EnglishGreeting; f.deg1 += ChineseGreeting; f.GreetPeople("lxy1", f.deg1); } } public class c1 { public GreetingDelegate deg1; public void GreetPeople(string name, GreetingDelegate MakeGreeting) { MakeGreeting(name); } } }
第5个程序:
目的:去掉难看的
f.deg1 = EnglishGreeting; 它是一句赋值。
我们希望两句都是绑定语句,如下面这样:
f.deg1 += EnglishGreeting;
f.deg1 += ChineseGreeting;
这种需求下,事件终于登场了!
如果只是把event关键字加上去,可以达到我们的目的。
但是下面这句报错。
f.GreetPeople("lxy1", f.deg1);
那么我们如何使用事件呢?
事件版程序如下:
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 WindowsFormsApp3 { public delegate void GreetingDelegate(string name); public partial class Form1 : Form { public Form1() { InitializeComponent(); } public void EnglishGreeting(string name) { Console.WriteLine("Morning, " + name); } public void ChineseGreeting(string name) { Console.WriteLine("早上好, " + name); } private void button1_Click(object sender, EventArgs e) { var f = new c1(); f.deg1 += EnglishGreeting; f.deg1 += ChineseGreeting; f.GreetPeople("lxy1"); } } public class c1 { public event GreetingDelegate deg1; public void GreetPeople(string name) { //MakeGreeting(name); if (null != deg1) deg1(name); } } }
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!