• C#指南,重温基础,展望远方!(7)C#结构


    结构是可以包含数据成员和函数成员的数据结构,这一点与类一样;与类不同的是,结构是值类型,无需进行堆分配。 结构类型的变量直接存储结构数据,而类类型的变量存储对动态分配的对象的引用。 结构类型不支持用户指定的继承,并且所有结构类型均隐式继承自类型 ValueType,后者又隐式继承自 object

    结构对包含值语义的小型数据结构特别有用。 复数、坐标系中的点或字典中的键值对都是结构的典型示例。 对小型数据结构使用结构(而不是类)在应用程序执行的内存分配次数上存在巨大差异。 例如,以下程序创建并初始化包含 100 个点的数组。 通过将 Point 实现为类,可单独实例化 101 个对象,一个对象用于数组,其他所有对象分别用于 100 个元素。

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

    也可以选择将 Point 实现为结构。

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

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

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

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

    C#
    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 的赋值的影响。

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

  • 相关阅读:
    typora, OneNote, notion, hexo, csdn,博客园对比
    Ubuntu18.04虚拟机下,docker拉取Oralce镜像
    [问题日志]wsl子系统卸载后重装出现故障的解决方案
    b站如何一次性取关10人
    (未完)CCF第24+25届全国计算辅助设计与图形学学术会议简记
    foolrenderer构建记录
    阿里云付哲:边缘云技术创新 让“云”无处不在
    从阿里云全球实时传输网络GRTN出发,浅谈QOE优化实践
    源于加速,不止加速 阿里云加速引擎的10年演化之路
    低成本、强交互、沉浸式的云游戏,究竟如何实现?
  • 原文地址:https://www.cnblogs.com/lzfsuifeng/p/9109457.html
Copyright © 2020-2023  润新知