C#的事件、委托测试(一) http://47.98.154.65/?id=1853
C#的事件、委托测试(二) http://47.98.154.65/?id=1854
C#的事件、委托测试(三) http://47.98.154.65/?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
版权声明:本文为博主原创文章,转载请附上博文链接!


少有人走的路



















