CSharp(C#)语言_第八章(结构)

结构

      • 8.1 什么是结构
      • 8.2结构是值类型
      • 8.3 对结构赋值
      • 8.4 构造函数和析构函数
        • 4.8.1 实例构造函数
        • 4.8.2 静态构造函数
        • 4.8.3 构造函数和析构函数
      • 8.5 字段初始化是不允许的
      • 8.6 结构是密封的
      • 8.7 装箱和拆箱
      • 8.8 结构作为返回值和参数
      • 8.9 关于结构的其他信息

8.1 什么是结构

  结构是程序员定义的数据类型,与类非常类似。它们有数据成员和函数成员。虽然与类相似,但是有许多重要的区别

最重要的区别是
  类是引用类型而结构是值类型
  结构是隐式密封的,这意味着它们不能被派生

8.2结构是值类型

所有值类型一样,结构类型变量含有自己的数据。

因此:
  结构类型的变量不能为null
  两个结构变量不能引用同一对象

8.3 对结构赋值

  把一个结构赋值给另一个结构,就将一个结构的值复制给另一个结构。这和复制类变量不同,复制类变量时只复制引用

8.4 构造函数和析构函数

  结构可以有实例构造函数和静态构造函数,但不允许有析构函数

4.8.1 实例构造函数

  语言隐式地为每个结构提供一个无参数的构造函数。这个构造函数把结构的每个成员设置为该类型的默认值。值成员设置成它们的默认值,引用成员设置成null

  预定义的无参数构造函数对每个结构都存在,而且不能删除或重定义。但是,可以创建另外的构造函数,只要它们有参数。注意,这和类不同。对于类,编译器只在没有其他构造函数声明时提供隐式的无参数构造函数

  调用一个构造函数,包括隐式无参数构造函数,要使用new运算符。注意,即使不从堆中分配内存也要使用new运算符

也可以不使用new运算符创建结构的实例(有局限性

① 在显示设置数据成员之后,才能使用它们的值
② 在对所用数据成员赋值之后,才能调用任何函数成员

4.8.2 静态构造函数

  与类相似,结构的静态构造函数创建并初始化静态数据成员,而且不能引用实例成员。结构的静态构造函数遵从与类的静态构造函数一样的规则
以下两种行为,任意一种发生之前,将会调用静态构造函数

Ⅰ 调用显式声明的构造函数
Ⅱ 引用结构的静态成员

4.8.3 构造函数和析构函数

类型 描述
实例构造函数(无参) 不能在程序中声明,系统为所有结构提供一个隐式的构造函数,它不能被程序删除或重定义
实例构造函数(有参) 可以在程序中声明
静态构造函数 可以在程序中声明
析构函数 不能在程序中声明,不允许声明析构函数

8.5 字段初始化是不允许的

字段初始化是不允许的

struct Simple
{
	public int x = 0;	//编译错误
}

8.6 结构是密封的

  结构总是隐式密封的,因此,不能从它们派生其他结构
  由于结构不支持继承,个别类成员修饰符用在结构成员上将没有意义。因此不能在结构成员声明时使用

不能用于结构的修饰符如下:
    protected
    internal
    abstract
    virtual

  结构本身派生自System.ValueTypeSystem.ValueType派生自object
  两个可以用于结构成员并与继承相关的关键字是newoverride修饰符,当创建一个和基类System.ValueType的成员有相同名称的成员时使用它们。所有结构都派生自System.ValueType

8.7 装箱和拆箱

  如同其他值类型数据,如果想将一个结构实例作为引用类型对象,必须创建装箱的副本,装箱的过程就是制作值类型变量的引用类型副本

8.8 结构作为返回值和参数

结构可以用作返回值和参数

返回值 当结构作为返回值时,将创建它的副本并从函数成员返回

值参数 当结构被用作值参数时,将创建实参结构的副本。该副本用于方法的执行中

refout参数 如果把一个结构用作ref或out参数,传入方法的是该结构的一个引用,这样就可以修改其数据成员

8.9 关于结构的其他信息

  对结构进行分配比创建类的实例开销小,所以使用结构代替类有时可以提高性能,但要注意到装箱和拆箱的高代价

最后,关于结构,需要知道的最后一些事情如下:

预定义简单类型(int、short、long,等等),尽管在.NET和C#中被视为原始类型,它们实际上在.NET中都实现为结构

可以使用与声明分部类相同的方法声明分部结构

结构和类一样,可以实现接口

你可能感兴趣的:(C#)