• 【C#语言规范版本5.0学习】1.6结构


    与类一样,结构 (struct) 是能够包含数据成员和函数成员的数据结构

    但是与类不同,结构是值类型,不需要堆分配

    结构类型的变量直接存储该结构的数据,而类类型的变量则存储对动态分配的对象的引用。

    结构类型不支持用户指定的继承,并且所有结构类型都隐式地从类型 object 继承。 结构对于具有值语义的小型数据结构尤为有用。复数、坐标系中的点或字典中的“键-值”对都是结构的典型示例

    对小型数据结构而言,使用结构而不使用类会大大节省需要为应用程序分配的内存数量。

    例如,下面的程序创建并初始化一个含有 100 个点的数组。对于作为类实现的 Point,实例化了 101 个 单独对象,其中,数组需要一个,其 100 个元素每个都需要一个。 

    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 的赋值不会影响 b 这一副本。 前一示例突出了结构的两个限制。首先,复制整个结构通常不如复制对象引用的效率高,因此结构的赋值和值参数传递可能比引用类型的开销更大。其次,除了 ref 和 out 参数,不可能创建对结构的引用, 这样限制了结构的应用范围。

  • 相关阅读:
    const 深悟理解
    深拷贝与浅拷贝深究
    结队开发-最大子数组
    软件工程个人作业02
    四则运算关于加括号的思路
    实践出真知-所谓"java没有指针",那叫做引用!
    写代码的好习惯—先构思
    团队合作
    阿超超的四则运算 想啊想啊
    Github+阿超运算
  • 原文地址:https://www.cnblogs.com/TechSingularity/p/14332101.html
Copyright © 2020-2023  润新知