5.3C#值类型之结构(Struct)

结构声明

struct 结构名称<类型参数> : 接口{
}

创建实例

结构 是可以包含数据成员和函数成员的数据结构,这一点与类一样;与类不同的是,结构是值类型,无需进行堆分配。 结构类型的变量直接存储结构数据,而类类型的变量存储对动态分配的对象的引用。 

class Point
{
    public int x, y;

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

class Test
{
    static void Main() {
        Point[] points = new Point[100];
        for (int i = 0; i < 100; i++) points[i] = new Point(i, i);
    }
}

另一种方法是创建 Point 结构。

struct Point
{
    public int x, y;

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

现在,仅实例化一个对象(即用于数组的对象),Point 实例存储内嵌在数组中。

结构构造函数使用 new 运算符进行调用,但这不并表示要分配内存。 结构构造函数只返回结构值本身(通常在堆栈的临时位置中),并在必要时复制此值,而非动态分配对象并返回对此对象的引用。

借助类,两个变量可以引用同一对象;因此,对一个变量执行的运算可能会影响另一个变量引用的对象。 借助结构,每个变量都有自己的数据副本;因此,对一个变量执行的运算不会影响另一个变量。 例如,下面的代码段生成的输出取决于 Point 是类还是结构。

Point a = new Point(10, 10);
Point b = a;
a.x = 20;
Console.WriteLine(b.x);

如果 Point 是一个类,则输出为 20 ,a 和 b 引用相同的对象。 如果 Point 是一个结构,则输出为 10, 因为 a 对于 b 的赋值创建值的副本,而此副本不受对 a.x 的后续赋值的影响。

以上示例突出显示了结构的两个限制。 首先,复制整个结构通常比复制对象引用效率更低,因此通过结构进行的赋值和值参数传递可能比通过引用类型成本更高。 其次,除 ref 和 out 参数以外,无法创建对结构的引用,这就表示在很多应用场景中都不能使用结构。

继承

结构不能声明基类型;它们从 System.ValueType 隐式派生。不能从 struct 类型派生其他 struct 类型。 这些类型已隐式密封。结构类型不支持用户指定的继承,并且所有结构类型均隐式继承自类型 object

原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/back/csharp/7873.html

发表评论

登录后才能评论