学习看点:在大型程序中类似的常量往往会大量存在
|
发布日期(Date):
[2021-07-13 T 16:50:34]
|
作者:周礼
作品名称:C#和.NET3.0第一步
网站知识内容来源全部名单: 查看
发表说明:
作者介绍:周礼。中山大学计算机应用专业硕士;拥有高级程序员证书;文学作品多次获奖。具有丰富的软件设计开发经验。曾任香港理工大学深圳研究院多媒体创新中心项目负责人(系统分析师)、台湾亚米多游戏科技有限公司开发工程师(高级软件工程师)、晨星资讯(深圳)有限公司项目负责人(系统工程师、分析师)、北大青鸟深圳鲲鹏培训中心.NET高级讲师。先后负责及参与的项目包括:语音卡驱动、游戏引擎、流媒体传输播放项目、远程教育平台、分布式金融数据采集等系统。目前从事IT教育培训工作,主要负责Java及.NET平台的课程培训。
在大型程序中类似的常量往往会大量存在,于是新的编程语言使用一种更好的结构来定义常量,这就是枚举类型。如今,枚举几乎在任何项目中都可以看到,使用枚举可以一次性定义一组常量,和常量的使用方式一样,枚举通常用在分支语句中,这种做法可以增强程序的可读性。在.NET中使用System命名空间下的enum关键字来定义枚举类型,下面的代码示例演示了如何定义一个枚举,并把这个枚举用在switch语句中:
using System;
using System.Text;
namespace MyNamespace
{
enum Days {Saturday,Sunday,Monday,Tuesday,Wednesday,Thursday,Friday };
class Program
{
public static void Main(string [] args)
{
DoWork(Days.Saturday);
DoWork(Days.Sunday);
DoWork(Days.Monday);
}
public static void DoWork(Days day)
{
switch (day)
{
case Days.Saturday:
Console.WriteLine("星期六,危险游戏");
break;
case Days.Sunday:
Console.WriteLine("星期天,费城故事");
break;
case Days.Monday:
Console.WriteLine("星期一,浮生若梦");
break;
}
}
}
}
运行结果:
星期六,危险游戏
星期天,费城故事
星期一,浮生若梦
上面我们在“我的地盘”(MyNamespace)里定义了一个名称为Days的枚举,这个枚举里有七个元素。这七个元素就是此枚举类型的成员,枚举成员我们可以使用“枚举名.成员”的方式引用。枚举是一种很特殊的类型,它的使用不像类等那么自由。枚举中的每一个元素实际上都是“符号/值”类型的,枚举的完整定义应该是下面这样:
enum Colors
{
Red=1,
Green=2,
Blue=4
}
给枚举成员指定的常数,其基础类型可以是除Char外的任何整型,默认是整型。如果你不给枚举中的成员赋值,那么它们的值将从0开始依次往下排。上面的Days枚举,Saturday对应0,Monday对应2,Friday对应6等。枚举的使用方法很多,归纳起来包括:提取枚举成员的数字部分、提取枚举成员的名称、遍历所有枚举成员及将字符串转换成枚举对象等操作。
using System;
namespace MyNamespace
{
enum Colors { Red=1,Green=2,Blue=4,Yellow=8 };
class Program
{
public static void Main(string [] args)
{
//提取枚举成员中的数字,为“1”
int ncolor=(int)Colors.Red;
//提取枚举成员的名字,为“Red”
string strcolor=Colors.Red.ToString();
//定义一个枚举对象
Colors cs=Colors.Red;
//遍历枚举
foreach(string s in Enum.GetNames(typeof(Colors)))
Console.WriteLine(s);
//将字符串转换成枚举对象
cs=(Colors)Enum.Parse(typeof(Colors),"Blue");
}
}
}
运行结果:
Red
Green
Blue
Yellow
另外,你可能对枚举的赋值方式产生疑问,比如上面的“Colors cs=Colors.Red”,我们来看一下枚举定义的原理你就明白了。上面的Colors枚举,实际上在系统内部会生成类似于下面这样的定义:
class Color
{
public static readonly Color Red=new Color(1);
public static readonly Color Green=new Color(2);
public int number;
private Color(int n) { number=n; }
}
从上面的定义,你就不难看出枚举为什么会有如此赋值方式,为什么枚举必须以自己的成员来初始化而不是使用new关键字。当然枚举在系统内部的实现要比上面复杂得多,但类似于此种定义方式。如前所述,枚举用法的祖宗就是常量,面向对象编程中引入枚举类型旨在增加程序的可读性和可操作性,除此之外没有别的作用。另外,因为枚举也是一个类型,所以在强类型系统中可以约束枚举的滥用,这是枚举比常量强大的地方。
结构——C语言的遗产
结构是从C语言遗留下来的一种类型,在C、C++、C#程序代码中都可以看到结构的影子。在C#中,结构采用struct关键字定义,它可以包含构造方法、常量、字段、方法、属性、索引器等成员。在C#中,你可以将结构想象为一个轻量类。与类不同的是,它们不能是抽象的,并且不支持继承。另外,结构与类的重要区别在于,结构是值类型,而类是引用类型。对于结构,构造方法的工作方式和类有一些差异。尤其是编译器始终为结构提供一个默认的无参数构造方法,它是不允许自己定义的。下面这个例子中我们定义了一个客户(Customer)结构类型,然后在Main方法中使用它,你会发现结构的定义和使用几乎和类一模一样,也的确是如此:
namespace Test
{
public struct Customer
{
public int ID;
public string Name;
public Customer(int customerID,string customerName)
{
ID=customerID;
Name=customerName;
}
}
class TestCustomer
{
static void Main()
{
Customer c1=new Customer();
System.Console.WriteLine("使用默认构造方法创建的结构:");
System.Console.WriteLine("ID={0},Name={1}",c1.ID,c1.Name);
Customer c2=new Customer(100,"Robert");
System.Console.WriteLine("使用带参构造方法创建的结构:");
System.Console.WriteLine("ID={0},Name={1}",c2.ID,c2.Name);
}
}
}
运行结果:
使用默认构造方法创建的结构:
ID=0,Name=
使用带参构造方法创建的结构:
ID=100,Name=Robert
结构是值类型,FCL中有不少系统类型都是结构类型,比如DateTime、Point等,它们和整型、字符型等一样都是值类型的。值类型和引用类型最大的不同在于,值类型定义后就会分配内存,而引用类型是动态分配内存的。也因此不宜定义复杂和大型的结构,结构通常用在系统需要小型的自定义类型时。因为值类型直接分配内存且效率比引用类型要高,所以结构还是有它的用武之地,通常结构用来充当不同系统之间的数据传递的载体或者用在效率要求极高的软件中,比如游戏程序设计中就会采用大量的结构,因为游戏是半实时系统,对效率要求较高。
|
|
|