第九章 枚举和结构

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都在栈上创建。

posted @ 2021-02-19 18:39  葡式蛋挞  阅读(7)  评论(0)    收藏  举报