1 using System; 2
/*------------------------------------------------------------------------------------------------------------
* 结构体:
* 1. 结构体中不可以为字段赋值(初始化);
* 2. 结构体中一直存在隐式的无参构造函数, 不能显示的
* 定义无参构造函数;
* 3. 结构体的构造函数中必须要为所有的字段赋值
* 4. 创建结构体对象可以不适用new()关键字,而类则必须
* 使用new()关键字
* 5. 结构体不能继承, 但能实现接口
* 6. 结构体是值类型
* 7. 结构体不能定义析构函数
* 8. 不能使用关键字: abstract / sealed 来修饰结构体;
------------------------------------------------------------------------------------------------------------*/
3 namespace struct_enum 4 { 5 /// <枚举类型enum> 6 /// enum: 值类型 7 /// 1.数据直接存储在栈中 8 /// 2.默认枚举中的第一个变量被赋值为0,其他的变量的值按定义的顺序来递增(0,1,2,3,4...) 9 /// 3.enum枚举类型的变量的名字不能相同,但是值可以相同, 10 /// 4.如果enum中的部分成员显式定义了值,那么没有定义值的成员还是会按照上一个成员的值来递增赋值. 11 /// 5.enum枚举成员可以用来作为位标志,同时支持位的操作(位与,位或等等) 12 /// enum CardDeckSettings : uint 13 /// { 14 /// SingleDeck = 0x01, //Bit 0 15 /// LargePictures = 0x02, //Bit 1 16 /// FancyNumbers = 0x04, //Bit 2 17 /// Animation = 0x08 //Bit 3 18 /// } 19 /// </枚举类型enum> 20 public enum Gender 21 { 22 男, 23 女 24 } 25 26 //===================================================================================== 27 28 /// <struct> 29 /// struct: 值类型(类是引用类型) 30 /// 1.直接继承自【System.ValueType】(继承自【System.Object】),不需要显示的指定; 31 /// 2.结构可以声明构造函数,但它们必须带参数;不能包含显式的无参数构造函数, 32 /// 3.与类不同,结构的实例化可以不使用【new】运算符。; 33 /// 4.结构的继承列表中只允许有接口,结构可以实现接口,一个结构不能从另一个结构或类继承,而且不能作为一个类的基; 34 /// 5.结构在定义变量时不能给定初始值; 36 /// </struct> 37 public struct Person 38 { 39 public string strName; 40 public int nBirthday; 41 public Gender gender; 42 } 43 44 public struct Person2 45 { 46 // 构造函数: 必须带参数 且必须加上【:this()】 47 public Person2(string name, Gender gd, int nBd) : this() 48 { 49 strName = name; 50 nBirthday = nBd; 51 gender = gd; 52 53 } 54 55 public string strName { get; private set; } 56 public int nBirthday { get; private set;} 57 public Gender gender { get; private set; } 58 59 public void fnTestPerson2(Person2 ps2) 60 { 61 Console.Write(" 测试 Person2: "); 62 Console.WriteLine("姓名: {0} , {1}, {2}", ps2.strName, ps2.gender, ps2.nBirthday); 63 Console.WriteLine(" ---------------------------------------"); 64 } 65 66 } 67 68 public struct Person3 69 { 70 // 姓名 71 private string name; 72 public string strName 73 { 74 get // 获取私有成员name的值 75 { 76 return this.name; 77 } 78 79 set // 给私有成员name赋值 80 { 81 this.name = value; // this代表person3的实例化对象 82 } 83 } 84 85 // 年龄 86 //private int age; // 私有 87 public int nAge // 对外公开 88 { 89 get; // 简写,相当于: get { return this.birthday; } 90 set; // 简写,相当于: set { return this.birthday = value; } 91 } 92 93 // 性别 94 //private Gender gender; 95 public Gender GENDER 96 { 97 get; 98 set; 99 } 100 101 public void fnTestPerson3(string strName, Gender gender, int nAge) 102 { 103 Console.Write(" 测试 Person3: "); 104 Console.WriteLine("姓名: {0} , {1}, {2}", strName, gender, nAge); 105 } 106 } 107 108 class Program 109 { 110 static void Main(string[] args) 111 { 112 // 测试Person 113 fnTestPerson(); 114 115 // 测试Person2 116 Person2 person2 = new Person2("小丽", Gender.女, DateTime.Now.Year - new DateTime(1980, 01, 06).Year); 117 person2.fnTestPerson2(person2); 118 119 // 测试Person3 120 Person3 person3 = new Person3(); // struct中有set/get访问器,则Person3实例化时必须new(),否则报错:error CS0165: 使用了未赋值的局部变量 121 person3.strName = "小王"; // 通过set访问器给私有成员name赋值,通过get访问器获取name的值 122 person3.GENDER = Gender.男; 123 person3.nAge = 35; 124 person3.fnTestPerson3(person3.strName, person3.GENDER, person3.nAge); 125 126 Console.ReadLine(); 127 128 } 129 130 // 测试Person 131 public static void fnTestPerson() 132 { 133 Person person; 134 person.strName = "小明"; // 对其成员赋值 135 person.gender = Gender.男; 136 person.nBirthday = DateTime.Now.Year - new DateTime(2010, 08, 09).Year; 137 138 Console.Write(" 测试 Person: "); 139 Console.WriteLine("姓名: {0} , {1}, {2}", person.strName, person.gender, person.nBirthday); 140 Console.WriteLine(" ---------------------------------------"); 141 } 142 } 143 }