结构体

结构体是一个轻量的对象,和类一样,也可以包含数据和操作.

结构体的定义

语法

[可见性修饰符] struct 名称
{

}

可见性修饰符:

定义结构体

 public struct Point
 {

 }

结构体都继承自System.ValueType,而且不能被继承。

C#中绝大部分类型都是类,结构体只用于一下简单结构,比如时间,坐标等。

结构的实例化

结构的实例化和类相似,不同的是,结构总是存在一个构造函数,用来初始化所有字段为默认值.

使用结构体

通过构造函数,可以创建结构体类型变量。

使用构造函数

Point p1 = new Point();
Point p2 = new Point(1,2);

结构的默认值

Point p;

在局部变量中,结构如果不被赋值,后续是不可使用的。

在类的字段中,结构的默认值是它的所有字段为默认值。

在结构的字段中,包含的结构必须被初始化。

结构体的成员

和类一样,结构体也能够包含多种成员。

一般,结构体会包含字段,方法,构造函数,类型转换和运算符重载,很少包含事件,索引器,嵌套类型。

构造函数

结构体的构造函数定义语法和类一致,但又有不少区别。

结构体拥有默认的公共构造函数,这个构造函数,总是存在,并且不能被重新定义,它将所有字段设置为默认值。

可以为结构体定义额外的构造函数。

为结构体定义构造函数

public struct Point
{
    int x;
    int y;
    public Point(int x,int y){
        this.x = x;
        this.y = y;
    }
}

Point定义了一个构造函数,但是它的默认构造函数还是存在的。

在自定义的构造函数中,必须为所有字段赋值。

字段

字段的定义语法和类一致。

为结构体定义字段

public struct Point
{
    int x;
    int y;
}

方法

结构体的方法定义和类相似。

public struct Point
{
    int x;
    int y;
    
    public Point(int x,int y){
        this.x = x;
        this.y = y;
    }
    
    public Point Offset(int x, int y)
    {
        return new Point(this.x + x, this.y + y);
    }
    
    public override String ToString()
    {
        return "X=" + x + ",Y=" + y;
    }
}

和类有不同的地方是,由于结构不能被继承,结构体的方法不能是virtual.

结构体可以重写父类的方法,只是不能使用sealed来修饰方法。因为结构不能被继承,也就没有必要了。

属性

结构体的属性定义和类相似。

用属性代替字段。

public struct Point
{
    public int X {get;private set;}
    public int Y {get;private set;}

    public Point(int x,int y){
        this.X = x;
        this.Y = y;
    }
}

由于属性就是一对方法,它的方法也不能是virtual.

事件

如果愿意,也是可以为结构定义事件的,不过这非常罕见。

索引器

索引器一般用于集合这样的类型,而结构体一般只不用作集合类型,是用不上索引器的。

何时使用结构体

建议字段总大小不大于16字节时使用结构体,结构总是通过复制自身来传递,过大会使复制成本提高。