结构体概念
在C#中,结构体是值类型,一般适用于表示类似Point、Rectangle、Color的对象
值类型能够降低对堆的管理、使用。降低垃圾回收,表现出更好的性能。可是值类型也有不好的一面。会涉及到装箱拆箱等操作
结构体声明
结构体声明定义了一种新的数据类型,这个数据类型可以为程序包含一个以上的成员变量
要定义一个结构,需要使用struct语句
声明一个学校的结构
1 struct School 2 { 3 public int name; 4 public string head_master; 5 public int class_number; 6 public int student_number; 7 };
结构体的使用
1 using System; 2 3 struct School 4 { 5 public int school_id; 6 public string head_master; 7 public int class_number; 8 public int student_number; 9 }; 10 11 public class testStructure 12 { 13 public static void Main(string[] args) 14 { 15 School TianYangHighSchool; // 声明一个学校 16 17 // 学校详细 18 TianYangHighSchool.school_id = 12345; 19 TianYangHighSchool.head_master = "Tynam.Yang"; 20 TianYangHighSchool.class_number = 6; 21 TianYangHighSchool.student_number = 456; 22 23 // 打印学校信息 24 Console.WriteLine("田阳高中学校的学校id是:{0}," + 25 "校长名字是:{1}," + 26 "一共有{2}个教室," + 27 "总共有{3}名学校", 28 TianYangHighSchool.school_id, 29 TianYangHighSchool.head_master, 30 TianYangHighSchool.class_number, 31 TianYangHighSchool.student_number); 32 33 Console.ReadKey(); 34 } 35 }
运行结果
结构体特点
结构体可以有方法,字段,索引器,属性,操作符方法和事件
结构体可以有定义的构造函数,但不能是析构函数。但是不能为结构定义默认构造函数。默认构造函数是自动定义的,不能被更改
与类不同,结构体不能继承其他结构体或类
结构体不能用作其他结构或类的基础
结构体可以实现一个或多个接口
结构成员不能被指定为抽象,虚拟或受保护
当使用New运算符创建一个struct对象时,它将调用相应的构造函数。 与类不同,可以在不使用New运算符的情况下实例化结构体
如果不使用New运算符,则字段保持未分配,并且在所有字段初始化之前不能使用对象
结构体 VS 类
结构体是值类型,存储在栈上,类是引用类型,存储在托管堆上,结构体在声明的时候就已经为其分配栈上的内存了,而类需要用 new为其分配堆上面的内存
结构体是隐式密封的,不能用 sealed 和 abstract 修饰,结构体不能被继承,类可以被继承
结构体中的实例字段只能声明,不能赋值,而类没有限制,结构体只声明没有用 new 进行初始化时,可以给他的实例字段赋值,而类不行
结构体没有析构函数,结构体中的方法不能用 virtual 和 abstract 修饰,但是可以用 override 修饰,用来重写父类的方法
结构体不能显示给出默认构造函数(无参数的构造),无论有没有自定义构造,默认构造都隐式存在,而类中有自定义构造函数时,默认构造会被隐藏,要想调用默认构造,必须显示给出默认构造
结构体的自定义构造函数必须初始化所有的实例字段和没有初始化的非静态属性,类没有限制
结构与类的选择
堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些
结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。在此情况下,结构的成本较低
在表现抽象和多级别的对象层次时,类是最好的选择
大多数情况下该类型只是一些数据时,结构时最佳的选择