第九章 枚举和结构
C#支持两种基本类型:值类型和引用类型。值类型的变量直接将值存储到栈上,而引用类型的变量包含的是引用(地址),
引用本身存储在栈上,但该引用指向堆上的对象。C#支持两种值类型:枚举和结构。
1.枚举
enum Month
{
January, February, March, April,
May, June, July, August,
September, October, November, December
}
...
Month first = Month.January;
Console.WriteLine(first); // 输出January
first++;
Console.WriteLine(first); // 输出February
Month second = Month.December;
Console.WriteLine(second); // 输出December
second++;
Console.WriteLine(second); // 输出12
虽然可以对枚举值执行数学运算,但如果运算结果溢出枚举定义的取值范围,“运行时”只能将变量的值解释成对应的整数值。
2.结构
类定义的是引用类型,总是在堆上创建。有时类只包含极少数据,因为管理堆而产生的开销不合算。这时更好的做法是将类型定义成结构。结构是值类型,在栈上存储,能有效减少内存管理的开销(当然前提是该结构足够小);
结构可包含自己的字段,方法和构造器(但不能主动声明默认构造器)。在C#语言中,基本数据类型int,long和float分别是System.Int32, System.Int64和System.Single这三个结构体的别名。这些结构有自己的字段和方法,可直接为这些类型的变量和字面值调用方法。例如,所有这些结构都提供了ToString方法,能将数值转换成对应的字符串形式。
int i = 22;
Console.WriteLine(i.ToString());
Console.WriteLine(22.ToString());
float f = 333.56F;
Console.WriteLine(f.ToString());
Console.WriteLine(333.56F.ToString());
Console.WriteLine((400,800).ToString()); // (400,800)是常量元组
string s = "43";
int j = int.Parse(s); // 完全等同于Int32.Parse
// int.Parse将字符串转换成对应的整数值。在这种情况下,实际上是调用了Int32.Parse方法。
3.结构和类的区别
a: 不能为结构声明默认构造器。编译器始终会为结构生成一个默认构造器,它总是将字段初始化为0, false或null。
自己写的构造器必须显示初始化所有字段。
struct Time
{
private int hour, minute, second;
public Time(int h, int m)
{
this.hour = h;
this.minute = m;
this.second = 0;
}
}
b: 类的字段可以在声明时初始化,但结构不允许。
struct Cake
{
private int size = 8; // 编译时错误
private int floor;
private float price;
}
4.结构初始化
struct Cola
{
private int count;
private float price;
public Cola(int c, float p)
{
this.count = c;
this.price = p;
}
}
// 调用构造器,前面描述的规则将保证结构中的所有字段都得到初始化

由于结构是值类型,所以不调用构造器也可以创建结构变量,

两种情况下,结构变量c,cDefault都在栈上创建。

浙公网安备 33010602011771号