11.C#基础之结构(完成)

     结构和类很相似,都是表示包含数据成员和函数成员的数据结构。不同的是,结构是一种值类型,并不需要堆分配。

     结构对于具有值语义的小的数据结构特别有用,复数、坐标中的点或字典中的键值对都是结构的典型示例。这种数据结构的关键之处在于:它们只有少量数据成员,不要求使用继承或引用标识,而且它们适合使用值语义。

  11.1结构声明

     结构声明是一种用于声明新结构的类型声明:

   11.1 结构修饰符

   11.1.2 结构接口

     结构声明中可以含有一个结构接口规定,这种情况下称该结构实现给定的接口类型。以后再详细写这个

   11.1.3 结构体

  11.2结构成员

     结构成员同样分两部分:一部分是由结构成员声明引入的成员,一部分是从类型System.ValueType继承的成员。

  11.3类和结构的区别

     结构在以下重要方面和类不同:刚开始说的,结构是值类型;

                                 所有结构类型隐式地从类System.ValueType继承;

                                 对于结构类型变量进行赋值意味着将创建所赋的值的一个"副本";

                                 结构的默认值计算如下:将所有值类型字段设置为它们的默认值,引用类型字段为null,这就产生了结构的默认值;

                                 使用装箱和拆箱操作在结构类型和object之间进行转换;

                                 对于结构,this的意义不同;

                                 在结构中,实例字段声明不能含有变量初始值设定值;

                                 在结构中不能声明无参数的实例构造函数;

                                 在结构中不能声明析构函数。

   11.3.1 值语义

     值语义就是值类型,意识就是结构类型的变量直接包含了该结构的数据,而引用类型是包含了对应数据的引用,类就是引用类型。

   11.3.2 继承

     所有结构类型都隐式地从类System.ValueType继承,而后者则从类object继承。结构声明可以指定实现接口列表,但不能指定基类。

     结构类型永远不会是抽象的,并且始终是隐式密封的。所以结构声明中不允许使用abstract和sealed修饰符。

     结构不支持继承,所以结构成员的可访问性不能是protected或者protected internal。

     结构中的函数成员不能是abstract或virtual,因此override修饰符只适用于重写System.ValueType继承的方法。

   11.3.3 赋值

     对结构类型变量的赋值创建了被赋值的一个"副本",这不同于类类型变量的赋值,类类型是赋值的引用,而不是所标识的对象。

     于赋值类似,将结构作为值参数传递或作为函数成员的结果返回时,也创建了该结构的一个副本。

     当结构的属性或索引器是赋值的目标时,与属性或索引器访问关联的实例表达式必须为变量类型;如果表达式是值类型,则发生编译时错误。

   11.3.4 默认值

     结构的默认值相当于该结构的默认构造函数所返回的值。刚才说过,结构不允许声明无参数的实例构造函数,因为每个结构隐式地具有一个无参数实例构造函数,该构造函数始终返回相同的值,即把值类型字段设置为它们的默认值,并将所有引用类型设置为null。

   11.3.5 拆箱和装箱

     由于结构不是引用类型,所以当结构类型的值转换为object类型或该结构实现的接口类型时,就会执行一次装箱;相反,object类型的值或接口类型的值被转回来,会执行拆箱操作。区别在于:装箱会把相关的结构值"复制"到"箱"中,拆箱时从已被装箱的实例中"复制"出一个结构值。因此进行这些操作后,对箱外的结构进行的更改不会影响已被装箱的结构。

   11.3.6 this的意义

     在类的实例构造函数和实例函数成员中,this为值类别,所以虽然this可以用于引用该函数成员调用所涉及的实例,但不可能在类的函数成员中对this本身复制。

     在结构的实例构造函数内,this相当于该结构类型的out参数;而在结构的实例函数成员内,this相当于该结构类型的ref参数。

   11.3.7 字段初始值设定项

     因为刚才说的默认值的原因,结构不允许它的实例字段声明中还有变量初始值设定项。此限定只适用于实例字段,在静态字段声明中可以含由变量初始值设定项。

   11.3.8 构造函数

     刚才一直再说结构不允许声明无参数实例构造函数,因为它本身有,但可以声明具有参数的实例构造函数。

     结构的实例构造函数不能含有base(...)形式的构造函数初始值设定项。

   11.3.9 析构函数

     不允许结构声明析构函数。

原文地址:https://www.cnblogs.com/dreamoffire/p/10109899.html