【四】使用枚举和结构来创建值类型

enum Season {Spring=0,Summer=22,Fall,Autumn=Fall,Winter=4}
Season colorful = Season.Fall;
string name = colorful.ToString();
Console.WriteLine(colorful);//输出Fall
Console.WriteLine(name);//输出Fall
Console.WriteLine((int)colorful);//输出23,这里注意23是因为summer的22加了1

枚举每个元素都关联(对应)着一个整数值。叫做基础整数值,或者基础值。
如果不为枚举文字常量指定一个常量整数值,编译器会自动为它指定比前一个枚举文字常量大1的值。
第一个枚举文字常量指定默认值是0
需要注意的是,多个枚举文字常量可以拥有相同的基础值。

为了节省内存的话可以选择
enum Season : short {Spring,Summer,Fall,Winter}

一个类型可以基于8种整数类型中的任何一种: byte,sbyte,short,ushort,int,uint,long,ulong 八种

可以对一个枚举可以执行数学运算,但假如运算结果超出枚举定义取值范围,“运行时”唯一可以做的就是将变量的值解释为对应的整数值。

//--------------------------------------------------
结构(struct):当类中只包含极少的数据,使用堆(heap)不合算,所以在栈(stack)上存储,即定义为结构(struct)
tips:
string s = "42";
int i = int.Parse(s);//int.Parse(字符串)是把字符串转化为int的方法

大多数的时候都不要将一个结构的字段声明为public字段!否则无法保证public字段总是包含有效值。

构造和类的区别:
①不能为结构声明默认构造器(一个无参构造器)。
因为编译器始终会帮我们生成一个默认的,并把字段设为0,false或者null;
我们要保证默认构造器创建的结构值具有符合逻辑的行为,所以,也可以自己声明一个非默认的构造器用来初始化(虽然编译器扔会生成默认构造器)
此时!注意!自己写的构造器中必须初始化所有的字段!否则无法通过编译。
②在类中可以在声明一个实例字段的时候同!时!初始化它,但在结构中不允许这样。
结构中必须先声明!然后让编译器默认初始化或者自己所有都初始化。

复制一个结构变量时,=操作符左侧的结构变量的每个字段都直接从右侧结构变量的相应字段中复制。
将一个结构变量赋值给另一个结构变量,前提是操作符=右边的struct变量已经被完全初始化(即所有字段已经被初始化了)

不自己写初始化的话,编译器就会默认初始化0、false、null。

//--以下内容很需要注意!!!!!!!!!!!!!!!!!!!!!!!!!
非常重要:复制值类型的变量时,将获得值的两个副本。相反,复制一个引用类型的变量时,将获得对同一个对象的两个引用。
Person Ming = new Person();
Person Gang = new Person();
Ming.Age = 23;
Gang = Ming;//这里其实是让Ming和Gang都引用了之前Ming对应的堆内存
Gang.Age = 25;
Console.WriteLine(Ming.Age);//输出值为25。
//--------------------------------------------------------
以上这点在结构这里同样有参考价值!

结构是值类型,复制值类型的变量会创造变量中所有数据的一个副本。
然而类是引用类型,复制引用类型变量复制的是对原始变量的引用!而类变量中数据发送改变的话,这个变量的所有引用都会变。

posted on 2015-01-16 17:34  相东  阅读(140)  评论(0编辑  收藏  举报

导航