警察抓小偷
或许现在你感觉不到事件机制的好处,这是必然的,因为你还没有接触到事件机制的具体应用。实际上Windows的编程技术都是建立在事件基础上的。不管是以前的VC MFC、VB窗体还是现在的Windows Form、ASP.NET窗体、WPF等编程都是以事件机制为基础。如此一来,理解事件机制的本质含义就显得非常重要。通过上面的例子你可能看出事件机制和委托技术有着千丝万缕的联系,事实上不只千丝万缕这么简单,事件机制内部就是通过多播委托来实现的。委托是一种编程技术,而事件机制是委托这种技术的一个应用。当然,既然系统为我们提供了专门的event关键字,那就是希望大家不要把事件当成委托。这样做有一个好处,就是对事件理解更形象更接近现实。因此在使用事件时不必考虑委托之类的东西,你可以认为事件就是事件,事件的使用就是定义事件、订阅事件和激发事件这三步曲。下面的例子是用程序模拟警察抓小偷的过程,它更形象的说明了事件使用的方法。
警察抓小偷模型:
(警铃响——1,警察听到(追赶)、2,小偷听到(逃跑),3,没听到的)
要实现这个程序你需要你定义警察类和小偷类。接下来是定义这两个类中警铃事件对应的方法,要注意,需要先定义事件处理方法然后才能定义事件。定义事件,需要先定义委托,定义完事件后,我们就可以写一个测试程序来实现警察抓小偷了:
using System;
using System.Collections.Generic;
using System.Text;
namespace MyNamespace
{
class 小偷
{
public void 跑() { Console.WriteLine("我用跑!"); }
}
class 警察
{
public void 追() { Console.WriteLine("给我追!");}
}
class 银行
{
public delegate void ActDelegate();
public event ActDelegate 警铃事件;
public void 警铃响() { 警铃事件(); }
}
class Program
{
public static void Main(string [] args)
{
银行 y=new 银行();
小偷 x=new 小偷();
警察 j1=new 警察();
警察 j2=new 警察();
y.警铃事件+=x.跑;
y.警铃事件+=j1.追;
y.警铃事件+=j2.追;
y.警铃响();
}
}
}
运行结果:
我用跑!
给我追!
给我追!
上面我们使用了中文作为类名和方法名来编程,这在Visual Studio中是可以的。当然我们不提倡使用中文来编写程序,因为代码稍微一多将显得非常乱。从上面Main方法里面的代码你明显的可以看出我们使用程序模拟了现实生活中警铃事件的处理。当然在程序中我们一般不会用到什么敲桌子、刹车和警铃之类事件。事件机制经常用在窗体编程领域,你点击一个按钮,输入一串文本都是事件,这些事件会触发相关的事件处理代码。
其他类型
C#为我们提供了很多类型,简单的值类型,自定义的类类型,以及用于抽象操作的接口,还有我们介绍的委托和事件类型。这些类型都是常用类型,除此之外,在编写C#程序时你还可能用到C#的其他类型,这些类型包括结构、枚举、密封类、分布类等。它们并不常用,但却在某些时候不得不用,这也是它们存在的原因。
枚举
在大型应用程序中我们经常定义常量来表示一些固定的信息,比如定义0代表鼠标左键,1表示鼠标右键等。通常高级语言都提供有关键字来定义常量,如Java里的final,C++里的const等,C#中提供了const和readonly两个关键字可以用来定义常量。你可以在字段或局部变量定义时使用这两个关键字来定义常量,常量一旦定义,在程序上下文中是只读的,不能随便修改它们。当然,const和readonly还是有一定的区别,区别就是readonly常量定义完后你还可以在类的构造方法里面修改它,而const常量定义完后就不能修改。要注意C#中const与C++中const修饰符是不同的,C#中const只能修饰字段和局部变量,不能修饰方法。常量的命名规则和变量相同,但常量一般都使用大写来定义,下面我们来看一个常量定义和使用的示例:
using System;
namespace Test
{
class Test
{
const double PI=3.1415926;
readonly int N=10;
public Test() { N=3; }
public void ShowPI()
{
for(int i=1;i<=N;i++)
Console.WriteLine("{0}PI={1}",i,PI * i);
/*
N=20;//错误不能修改
PI=3.14;//错误不能修改
*/
}
[STAThread]
static void Main(string [] args)
{
Test t=new Test();
t.ShowPI();
}
}
}
运行结果:
1PI=3.1415926
2PI=6.2831852
3PI=9.4247778
}
class 警察
{
public void 追() { Console.WriteLine("给我追!");}
}
class 银行
{
public delegate void ActDelegate();
public event ActDelegate 警铃事件;
public void 警铃响() { 警铃事件(); }
}
class Program
{
public static void Main(string [] args)
{
银行 y=new 银行();
小偷 x=new 小偷();
警察 j1=new 警察();
警察 j2=new 警察();
y.警铃事件+=x.跑;
y.警铃事件+=j1.追;
y.警铃事件+=j2.追;
y.警铃响();
}
}
}
运行结果:
我用跑!
给我追!
给我追!
上面我们使用了中文作为类名和方法名来编程,这在Visual Studio中是可以的。当然我们不提倡使用中文来编写程序,因为代码稍微一多将显得非常乱。从上面Main方法里面的代码你明显的可以看出我们使用程序模拟了现实生活中警铃事件的处理。当然在程序中我们一般不会用到什么敲桌子、刹车和警铃之类事件。事件机制经常用在窗体编程领域,你点击一个按钮,输入一串文本都是事件,这些事件会触发相关的事件处理代码。
其他类型
C#为我们提供了很多类型,简单的值类型,自定义的类类型,以及用于抽象操作的接口,还有我们介绍的委托和事件类型。这些类型都是常用类型,除此之外,在编写C#程序时你还可能用到C#的其他类型,这些类型包括结构、枚举、密封类、分布类等。它们并不常用,但却在某些时候不得不用,这也是它们存在的原因。
枚举
在大型应用程序中我们经常定义常量来表示一些固定的信息,比如定义0代表鼠标左键,1表示鼠标右键等。通常高级语言都提供有关键字来定义常量,如Java里的final,C++里的const等,C#中提供了const和readonly两个关键字可以用来定义常量。你可以在字段或局部变量定义时使用这两个关键字来定义常量,常量一旦定义,在程序上下文中是只读的,不能随便修改它们。当然,const和readonly还是有一定的区别,区别就是readonly常量定义完后你还可以在类的构造方法里面修改它,而const常量定义完后就不能修改。要注意C#中const与C++中const修饰符是不同的,C#中const只能修饰字段和局部变量,不能修饰方法。常量的命名规则和变量相同,但常量一般都使用大写来定义,下面我们来看一个常量定义和使用的示例:
using System;
namespace Test
{
class Test
{
const double PI=3.1415926;
readonly int N=10;
public Test() { N=3; }
public void ShowPI()
{
for(int i=1;i<=N;i++)
Console.WriteLine("{0}PI={1}",i,PI * i);
/*
N=20;//错误不能修改
PI=3.14;//错误不能修改
*/
}
[STAThread]
static void Main(string [] args)
{
Test t=new Test();
t.ShowPI();
}
}
}
运行结果:
1PI=3.1415926
2PI=6.2831852
3PI=9.4247778
警察抓小偷
或许现在你感觉不到事件机制的好处,这是必然的,因为你还没有接触到事件机制的具体应用。实际上Windows的编程技术都是建立在事件基础上的。不管是以前的VC MFC、VB窗体还是现在的Windows Form、ASP.NET窗体、WPF等编程都是以事件机制为基础。如此一来,理解事件机制的本质含义就显得非常重要。通过上面的例子你可能看出事件机制和委托技术有着千丝万缕的联系,事实上不只千丝万缕这么简单,事件机制内部就是通过多播委托来实现的。委托是一种编程技术,而事件机制是委托这种技术的一个应用。当然,既然系统为我们提供了专门的event关键字,那就是希望大家不要把事件当成委托。这样做有一个好处,就是对事件理解更形象更接近现实。因此在使用事件时不必考虑委托之类的东西,你可以认为事件就是事件,事件的使用就是定义事件、订阅事件和激发事件这三步曲。下面的例子是用程序模拟警察抓小偷的过程,它更形象的说明了事件使用的方法。
警察抓小偷模型:
(警铃响——1,警察听到(追赶)、2,小偷听到(逃跑),3,没听到的)
要实现这个程序你需要你定义警察类和小偷类。接下来是定义这两个类中警铃事件对应的方法,要注意,需要先定义事件处理方法然后才能定义事件。定义事件,需要先定义委托,定义完事件后,我们就可以写一个测试程序来实现警察抓小偷了:
using System;
using System.Collections.Generic;
using System.Text;
namespace MyNamespace
{
class 小偷
{
public void 跑() { Console.WriteLine("我用跑!"); }
}
class 警察
{
public void 追() { Console.WriteLine("给我追!");}
}
class 银行
{
public delegate void ActDelegate();
public event ActDelegate 警铃事件;
public void 警铃响() { 警铃事件(); }
}
class Program
{
public static void Main(string [] args)
{
银行 y=new 银行();
小偷 x=new 小偷();
警察 j1=new 警察();
警察 j2=new 警察();
y.警铃事件+=x.跑;
y.警铃事件+=j1.追;
y.警铃事件+=j2.追;
y.警铃响();
}
}
}
运行结果:
我用跑!
给我追!
给我追!
上面我们使用了中文作为类名和方法名来编程,这在Visual Studio中是可以的。当然我们不提倡使用中文来编写程序,因为代码稍微一多将显得非常乱。从上面Main方法里面的代码你明显的可以看出我们使用程序模拟了现实生活中警铃事件的处理。当然在程序中我们一般不会用到什么敲桌子、刹车和警铃之类事件。事件机制经常用在窗体编程领域,你点击一个按钮,输入一串文本都是事件,这些事件会触发相关的事件处理代码。
其他类型
C#为我们提供了很多类型,简单的值类型,自定义的类类型,以及用于抽象操作的接口,还有我们介绍的委托和事件类型。这些类型都是常用类型,除此之外,在编写C#程序时你还可能用到C#的其他类型,这些类型包括结构、枚举、密封类、分布类等。它们并不常用,但却在某些时候不得不用,这也是它们存在的原因。
枚举
在大型应用程序中我们经常定义常量来表示一些固定的信息,比如定义0代表鼠标左键,1表示鼠标右键等。通常高级语言都提供有关键字来定义常量,如Java里的final,C++里的const等,C#中提供了const和readonly两个关键字可以用来定义常量。你可以在字段或局部变量定义时使用这两个关键字来定义常量,常量一旦定义,在程序上下文中是只读的,不能随便修改它们。当然,const和readonly还是有一定的区别,区别就是readonly常量定义完后你还可以在类的构造方法里面修改它,而const常量定义完后就不能修改。要注意C#中const与C++中const修饰符是不同的,C#中const只能修饰字段和局部变量,不能修饰方法。常量的命名规则和变量相同,但常量一般都使用大写来定义,下面我们来看一个常量定义和使用的示例:
using System;
namespace Test
{
class Test
{
const double PI=3.1415926;
readonly int N=10;
public Test() { N=3; }
public void ShowPI()
{
for(int i=1;i<=N;i++)
Console.WriteLine("{0}PI={1}",i,PI * i);
/*
N=20;//错误不能修改
PI=3.14;//错误不能修改
*/
}
[STAThread]
static void Main(string [] args)
{
Test t=new Test();
t.ShowPI();
}
}
}
运行结果:
1PI=3.1415926
2PI=6.2831852
3PI=9.4247778