C#笔记08 结构体
——本系列是基于人民邮电出版社《C#2008 C#图解教程》、清华大学出版社《C#入门经典(第五版)》两本书的自学C#笔记,如果您发现了本文的纰漏,还望不吝指正。
写在前边
*复习:类型是一种模版,C#提供了15种预定义类型,还可以创建自己的用户定义类型,有6种类型:
- 类类型(class)
- 结构类型(struct)
- 数组类型(array)
- 枚举类型(enum)
- 委托类型(delegate)
- 接口类型(interface)
1. 什么是结构体
结构体就是由几个数据组成的数据结构,这些数据可能具有不同的类型。根据这个结构,可以定义自己的变量类型。
- 结构体是值类型
- 结构体是隐式密封的,所以它们不能被派生,也就是不支持继承(关于继承:C#笔记进阶篇01 类的继承)
2. 结构体的声明
由于结构体是值类型,所以和所有值类型一样,结构体变量含有它自己的数据,所以:
- 结构体的变量不能为null
- 两个结构体不能引用同一对象
struct 结构名
{ 成员,成员,成员 }
struct route
{
public orientation direction;
public double distance;
public static int age;
}
另外需要注意:
- 结构体中字段初始化是不允许的
如下代码,在编译时会产生编译错误
//错误示范
struct Simple
{
public int x = 0; //结构体中字段初始化是不允许的
public int y = 0;
}
3.结构体的使用
1).结构体在使用时,需要实例化一个对象
结构体名 变量名(对象名)=new 结构体名();
route myRoute = new route(); //或者route myRoute,不使用new
2).结构体对象成员的调用
对象名.成员
myRoute.direction = orientation.north;
myRoute.distance = 2.5;
3).结构体静态成员的调用
结构体名.成员名
route.age = 18;
4.结构体和类的区别
(对比之后关于C#类的笔记进行学习)
1).类对象是引用数据类型(复杂结构),结构体对象是值类型(对运算速度要求更高、数据结构简单)
上图出自 人民邮电出版社《C#2008 C#图解教程》第12章
2).类中的字段可以赋初始值,结构体不能
3).类中的有参构造函数可以不对字段进行赋值,但是结构体必须对所有字段完全赋值
4).类中有了有参构造,系统不会默认添加构造函数,结构体中即使有了有参构造,系统还会默认添加无参构造,不能自己显式添加(下图)
写在最后
(扩展学习)
- 15种预定义类型中的简单类型(int、short、long等),实际上都是在.NET内部通过结构体实现的
- 默认的无参构造函数,为所有的字段赋值,值类型的字段赋值0,引用类型的字段赋值null
- 虽然结构体不能从另外一个结构或者类继承,但是可以实现接口
- 结构体本身派生自System.ValueType,而System.ValueType派生自System.Obect,所以结构体对象仍然拥有超类Object的成员