一、P20、21、22内容总结
二、事件的概念P20
三、事件的应用P21
//每1秒屏幕上打印jump和sing
class Program
{
static void Main(string[] args)
{
//timer 事件的拥有者
Timer timer = new Timer();
timer.Interval = 1000;
//boy&girl 事件响应者
Boy boy = new Boy();
Girl girl = new Girl();
//Elapsed 事件
//Action 事件处理器
//事件订阅
timer.Elapsed += boy.Action;
timer.Elapsed += girl.Action;
timer.Start();
Console.ReadLine();
}
}
class Boy
{
//Action 事件处理器
internal void Action(object sender, ElapsedEventArgs e)
{
Console.WriteLine("Jump");
}
}
class Girl
{
//Action 事件处理器
internal void Action(object sender, ElapsedEventArgs e)
{
Console.WriteLine("Sing");
}
}
实例二
事件拥有者与事件响应者是完全不同的两个对象;
事件响应者用自己的方法(事件处理器)订阅事件,当事件发生时事件处理器就执行了。
//当鼠标点击窗口时,窗口名称显示当前时间
static void Main(string[] args)
{
//form 事件的拥有者
Form form = new Form();
//事件的响应者
Controller controller = new Controller(form);
form.ShowDialog();
}
class Controller
{
private Form form1;
public Controller(Form form)
{
if(form!=null)
{
this.form1 = form;
//Click 事件
//FormClicked 事件处理器
//事件订阅
this.form1.Click += this.FormClicked;
}
}
//FormClicked 事件处理器
private void FormClicked(object sender, EventArgs e)
{
this.form1.Text = DateTime.Now.ToString();
}
}
实例三
事件拥有者与事件响应者是同一个对象;
一个对象拿着自己的方法订阅和处理自己的事件
注意:派生==继承,即在原有的某个类的基础上扩展功能
static void Main(string[] args)
{
//form 事件的拥有者&事件的响应者
MyForm form = new MyForm();
//Click 事件
//FormClicked 事件处理器
//事件订阅
form.Click += form.FormClicked;
form.ShowDialog();
}
class MyForm : Form
{
//FormClicked 事件处理器
internal void FormClicked(object sender, EventArgs e)
{
this.Text = DateTime.Now.ToString();
}
}
实例四
事件拥有者是事件响应者的字段成员;
事件响应者用自己的方法订阅自己成员的事件
//窗口里有一个按钮,点击这个按钮文本框里就显示“hello world”
//非可视化编程,运行后要对控件位置进行调整
static void Main(string[] args)
{
//form 事件的响应者
MyForm form = new MyForm();
form.ShowDialog();
}
class MyForm : Form
{
private TextBox textBox;
//button 事件的拥有者
private Button button;
public MyForm()
{
//创建控件实例并且把控件添加到空间集合中
this.button = new Button();
this.textBox = new TextBox();
this.Controls.Add(this.button);
this.Controls.Add(this.textBox);
//Click 事件
//ButtonClicked 事件处理器
//事件订阅
this.button.Click += this.ButtonClicked;
}
private void ButtonClicked(object sender, EventArgs e)
{
this.textBox.Text = "Hello world!!!!!!!!!!!!!";
}
}
//可视化编程
//在代码中无法找到事件订阅,但是右击事件处理器查找“所有引用”中可以看到“事件订阅”已经自动生成
public partial class Form1 : Form
{
//form 事件的响应者
public Form1()
{
InitializeComponent();
}
//Click 事件
//button 事件的拥有者
//myButton_Click 事件处理器
private void myButton_Click(object sender, EventArgs e)
{
textBox.Text = "Hello,World!";
}
注意:一个事件可以同时挂接多个事件处理器;一个事件处理器可以被多个事件挂接
老师后面又举了好几个小例子,没有全部记录了。
三、事件的声明P22
namespace ConsoleApp1
{
//案例:餐厅服务员订阅和处理点菜
//Customer 事件的拥有者
//声明委托类型,为声明Order事件做准备,注意与声明委托类型字段区分
//Order 声明点菜事件
//Waiter 事件响应者
//Action 事件处理器
//事件订阅
class Program
{
static void Main(string[] args)
{
Customer customer = new Customer();
Waiter waiter = new Waiter();
//Action 事件处理器
//事件订阅
customer.Order += waiter.Action;
customer.Action();
customer.PayTheBill();
}
}
//传递事件信息的类
public class OrderEventArgs:EventArgs
{
public string DishName { get; set; }
public string Size { get; set; }
}
//声明委托类型,为声明Order事件做准备
public delegate void OrderEventHandler(Customer customer, OrderEventArgs e);
//事件的拥有者
public class Customer
{
//Order 声明事件 点菜事件
//完整事件声明
/*private OrderEventHandler orderEventHandler;
public event OrderEventHandler Order
{
add
{
this.orderEventHandler += value;
}
remove
{
this.orderEventHandler -= value;
}
}*/
//简易声明
public event OrderEventHandler Order;
public double Bill { get; set; }
public void PayTheBill()
{
Console.WriteLine("I will pay ${0}.",this.Bill);
}
public void WalkIn()
{
Console.WriteLine("walking");
}
public void SitDown()
{
Console.WriteLine("Sit down");
}
public void Think()
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine("thinking");
Thread.Sleep(1000);
}
if (this.Order!=null)
{
OrderEventArgs e = new OrderEventArgs();
e.DishName = "KongPao Chicken";
e.Size = "large";
this.Order.Invoke(this, e);
}
}
public void Action()
{
Console.ReadLine();
this.WalkIn();
this.SitDown();
this.Think();
}
}
//Waiter 事件响应者
public class Waiter
{
internal void Action(Customer customer,OrderEventArgs e)
{
//上菜加记账
Console.WriteLine("I will serve you the dish-{0}",e.DishName);
double price = 10;
switch(e.Size)
{
case "small":
price = price * 0.5;
break;
case "large":
price = price * 1.5;
break;
default:
break;
}
customer.Bill += price;
}
}
}
实例二:省去委托类型的声明
namespace ConsoleApp1
{
//案例:餐厅服务员订阅和处理点菜
//Customer 事件的拥有者
//声明委托类型,为声明Order事件做准备,注意与声明委托类型字段区分
//Order 声明点菜事件
//Waiter 事件响应者
//Action 事件处理器
//事件订阅
class Program
{
static void Main(string[] args)
{
Customer customer = new Customer();
Waiter waiter = new Waiter();
//Action 事件处理器
//事件订阅
customer.Order += waiter.Action;
customer.Action();
customer.PayTheBill();
}
}
//传递事件信息的类
public class OrderEventArgs:EventArgs
{
public string DishName { get; set; }
public string Size { get; set; }
}
//声明委托类型,为声明Order事件做准备
//public delegate void OrderEventHandler(Customer customer, OrderEventArgs e);
//事件的拥有者
public class Customer
{
//Order 声明事件 点菜事件
//完整事件声明
/*private OrderEventHandler orderEventHandler;
public event OrderEventHandler Order
{
add
{
this.orderEventHandler += value;
}
remove
{
this.orderEventHandler -= value;
}
}*/
//简易声明
public event EventHandler Order;
public double Bill { get; set; }
public void PayTheBill()
{
Console.WriteLine("I will pay ${0}.",this.Bill);
}
public void WalkIn()
{
Console.WriteLine("walking");
}
public void SitDown()
{
Console.WriteLine("Sit down");
}
public void Think()
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine("thinking");
Thread.Sleep(1000);
}
if (this.Order!=null)
{
OrderEventArgs e = new OrderEventArgs();
e.DishName = "KongPao Chicken";
e.Size = "large";
this.Order.Invoke(this, e);
}
}
public void Action()
{
Console.ReadLine();
this.WalkIn();
this.SitDown();
this.Think();
}
}
//Waiter 事件响应者
public class Waiter
{
internal void Action(object sender,EventArgs e)
{
Customer customer=sender as Customer;
OrderEventArgs orderInfo = e as OrderEventArgs;
//上菜加记账
Console.WriteLine("I will serve you the dish-{0}", orderInfo.DishName);
double price = 10;
switch(orderInfo.Size)
{
case "small":
price = price * 0.5;
break;
case "large":
price = price * 1.5;
break;
default:
break;
}
customer.Bill += price;
}
}
}
实例三:面向对象设计的原则,一个方法一件事,将public void Think()方法进行改造
namespace ConsoleApp1
{
//案例:餐厅服务员订阅和处理点菜
//Customer 事件的拥有者
//声明委托类型,为声明Order事件做准备,注意与声明委托类型字段区分
//Order 声明点菜事件
//Waiter 事件响应者
//Action 事件处理器
//事件订阅
class Program
{
static void Main(string[] args)
{
Customer customer = new Customer();
Waiter waiter = new Waiter();
//Action 事件处理器
//事件订阅
customer.Order += waiter.Action;
customer.Action();
customer.PayTheBill();
}
}
//传递事件信息的类
public class OrderEventArgs:EventArgs
{
public string DishName { get; set; }
public string Size { get; set; }
}
//声明委托类型,为声明Order事件做准备
//public delegate void OrderEventHandler(Customer customer, OrderEventArgs e);
//事件的拥有者
public class Customer
{
//Order 声明事件 点菜事件
//完整事件声明
/*private OrderEventHandler orderEventHandler;
public event OrderEventHandler Order
{
add
{
this.orderEventHandler += value;
}
remove
{
this.orderEventHandler -= value;
}
}*/
//简易声明
public event EventHandler Order;
public double Bill { get; set; }
public void PayTheBill()
{
Console.WriteLine("I will pay ${0}.",this.Bill);
}
public void WalkIn()
{
Console.WriteLine("walking");
}
public void SitDown()
{
Console.WriteLine("Sit down");
}
public void Think()
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine("thinking");
Thread.Sleep(1000);
}
this.OnOnder("KongPao Chicken","large");
}
//触发事件
public void OnOnder(string dishName,string size)
{
if (this.Order != null)
{
OrderEventArgs e = new OrderEventArgs();
e.DishName = dishName;
e.Size = size;
this.Order.Invoke(this, e);
}
}
public void Action()
{
Console.ReadLine();
this.WalkIn();
this.SitDown();
this.Think();
}
}
//Waiter 事件响应者
public class Waiter
{
internal void Action(object sender,EventArgs e)
{
Customer customer=sender as Customer;
OrderEventArgs orderInfo = e as OrderEventArgs;
//上菜加记账
Console.WriteLine("I will serve you the dish-{0}", orderInfo.DishName);
double price = 10;
switch(orderInfo.Size)
{
case "small":
price = price * 0.5;
break;
case "large":
price = price * 1.5;
break;
default:
break;
}
customer.Bill += price;
}
}
}
二、问题辨析P22:事件与委托的关系