六、枚举和结构体
Covers:枚举和结构体
枚举
枚举是一种有限集合。生活中的有限集合很多,比如“一周中每天的名称”只有 7 种、“生日对应的星座”只有 12 种(现在好像是 13 种了?),这些事物都适合用枚举来描述。
写一个枚举的例子:
using System;
namespace Enums
{
enum Weekday
{
Sun,
Mon,
Tue,
Wed,
Thu,
Fri,
Sat,
}
class Program
{
static void Main()
{
Weekday today = Weekday.Sat;
Console.WriteLine(today + " = " + (int) today);
}
}
}
我们用关键字 enum
定义枚举类型 Weekday,它有 7 种取值,对应一周中每天的名称;我们在 Main 中创建了一个枚举变量 today 并初始化(注意 枚举项前也需要加上枚举类型名),并进行了两种打印尝试:
- 直接打印这个枚举量
- 将枚举量强转成 int 型后再打印
控制台输出:
Sat = 6
可见,在实现上,枚举是具名的整型量,它可以直接强转为枚举项对应的整数(默认情况下,各枚举量按顺序从 0 开始递增,也可以手动指定),当其被直接打印时,则打印枚举项的名称。
结构体
所有对 C/C++ 编程有些许经验的人都知道结构体是什么,不知道也不要紧,结构体就是将数据和函数打个包,听起来好像跟类的概念基本一样?没错,在 C++ 中 结构体和类几乎没有区别,值得注意的区别只有默认访问权限的不同。结构体是实至名归的面向对象的始祖,从 C 开始就有人利用结构体实现一些基本的面向对象概念了,只是 C 的结构体不能直接包含函数(但可以包含函数指针)。
我们看一个简单的 C# 结构体,注意其定义语法:
struct Person
{
public string Name;
public int Age;
public void PrintInfo()
{
Console.WriteLine("{0}({1})", Name, Age);
}
}
class Program
{
static void Main()
{
Person me = new Person
{
Name = "Oasin",
Age = 21
};
++me.Age;
me.PrintInfo();
}
}
我们用 struct
关键字定义结构体 Person,它“打包”了两个变量 Name 和 Age,都是内置类型,称为 字段,设定为 public 权限;又“打包”了一个方法 PrintInfo,也是 public 权限(注意该方法不需要用 static 修饰);我们在 Main 中创建了一个结构体对象 me 并初始化;最后用点号访问了 me 的 Age 字段和 PrintInfo 方法。
C# 中,结构体和类有显著的区别:
- 结构体是值类型,类是引用类型,结构体从
System.ValueType
继承而来,类从System.Object
继承而来; - 结构体不能从任何类或结构体中派生而来,也不能被继承,但可以实现接口(听不懂就忽略);
- 结构体不能具有默认构造器,听起来头大的话换个说法,结构体的属性不能有默认值;
- 结构体的实例即使用
new
创建,也会 创建在栈上,具有很高的访问速度; - 结构体不能具有析构函数(听不懂就忽略)。
**如何在类和结构体之间取舍:**结构体的内存效率比类高很多,因此当你希望创造一种行为简单、内容少、快速的“类”(例如在一个循环中要反复创建、处理和丢弃大量简单对象)时,使用结构体最好;当你需要更高级的面向对象特性(虽然我们还没学)时,或者类中的数据很多、要频繁在方法之间传递时,用类最好。
你可以将结构体理解为“最接近内置类型”的自定义类型,它非常简单而“纯粹”,在其中编写的方法也要尽可能简单明了。写程序的原则是化繁为简,当能够用简单的结构解决问题时,就不要用复杂的类。
T.B.C.