结构是可以包含数据成员和函数成员的数据结构,这一点与类一样;与类不同的是,结构是值类型,无需进行堆分配。 结构类型的变量直接存储结构数据,而类类型的变量存储对动态分配的对象的引用。 结构类型不支持用户指定的继承,并且所有结构类型均隐式继承自类型 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 参数以外,无法创建对结构的引用,这就表示在很多应用场景中都不能使用结构。

C#指南,重温基础,展望远方!(7)C#结构的更多相关文章

  1. 【重温基础】17.WebAPI介绍

    本文是 重温基础 系列文章的第十七篇. 今日感受:挑战. 系列目录: [复习资料]ES6/ES7/ES8/ES9资料整理(个人整理) [重温基础]1-14篇 [重温基础]15.JS对象介绍 [重温基础 ...

  2. chrome调试工具高级不完整使用指南(基础篇)

    一.前言 本文记录的是作者在工作上面对chrome的一些使用和情况的分析分享,内容仅代表个人的观点.转发请注明出处(http://www.cnblogs.com/st-leslie/),谢谢合作 二. ...

  3. 【重温基础】16.JSON对象介绍

    本文是 重温基础 系列文章的第十六篇. 今日感受:静. 系列目录: [复习资料]ES6/ES7/ES8/ES9资料整理(个人整理) [重温基础]1-14篇 [重温基础]15.JS对象介绍 本章节复习的 ...

  4. 【重温基础】15.JS对象介绍

    从这篇文章开始,复习 MDN 中级教程 的内容了,在初级教程中,我和大家分享了一些比较简单基础的知识点,并放在我的 [Cute-JavaScript]系列文章中. 关于[Cute-JavaScript ...

  5. 【重温基础】11.Map和Set对象

    本文是 重温基础 系列文章的第十一篇. 今日感受:注意身体,生病花钱又难受. 系列目录: [复习资料]ES6/ES7/ES8/ES9资料整理(个人整理) [重温基础]1.语法和数据类型 [重温基础]2 ...

  6. Matlab基础之单元数组和结构数组

    Matlab基础之单元数组和结构数组 前言: 单元数组和结构数组是一种新的数据类型,能将不同类型.不同维数的数组组合在一起,从而方便对不同的数据类型方便管理和维护. 如上图所示的2*2矩阵中,分别存储 ...

  7. C#指南,重温基础,展望远方!(10)C#枚举

    枚举类型是包含一组已命名常量的独特值类型. 需要定义包含一组离散值的类型时,可以定义枚举. 枚举使用一种整型值类型作为其基础存储, 并提供离散值的语义含义. 以下示例声明并使用名为“Color”的 e ...

  8. C#指南,重温基础,展望远方!(6)C#类和对象

    类是最基本的 C# 类型. 类是一种数据结构,可在一个单元中就将状态(字段)和操作(方法和其他函数成员)结合起来. 类为动态创建的类实例(亦称为“对象”)提供了定义. 类支持继承和多形性,即派生类可以 ...

  9. C#指南,重温基础,展望远方!(4)表达式

    表达式是在操作数和运算符的基础之上构造而成. 表达式的运算符指明了向操作数应用的运算. 运算符的示例包括 +.-.*./ 和 new. 操作数的示例包括文本.字段.局部变量和表达式. 如果表达式包含多 ...

  10. C#指南,重温基础,展望远方!(3)类型和变量

    C# 有两种类型:值类型和引用类型. 值类型的变量直接包含数据,而引用类型的变量则存储对数据(称为“对象”)的引用.对于引用类型,两个变量可以引用同一对象:因此,对一个变量执行的运算可能会影响另一个变 ...

随机推荐

  1. Handling Errors and Exceptions

    http://delphi.about.com/od/objectpascalide/a/errorexception.htm Unfortunately, building applications ...

  2. Druid如何自动根据URL自动识别DriverClass的

    Druid是根据url前缀来识别DriverClass的,这样使得配置更方便简洁. 前缀 DriverCLass 描述信息 jdbc:odps com.aliyun.odps.jdbc.OdpsDri ...

  3. 不用call和apply方法模拟实现ES5的bind方法

    本文首发我的个人博客:前端小密圈,评论交流送1024邀请码,嘿嘿嘿

  4. shell练习题

    一.编写一个脚本使我们在写一个脚本时自动生成”#!/bin/bash”这一行和注释信息. 原文代码为:         Shell   1 2 3 4 5 6 7 8 9 10 #!/bin/bash ...

  5. 借助Maven为项目划分development,test,production环境

    原文地址:http://melin.iteye.com/blog/1339060 很早学习rails的时候,rails在服务器启动的时候,通过参数可以切换不同运行环境.也许spring从rails吸取 ...

  6. Eclipse maven构建springmvc项目

    原文地址: http://www.cnblogs.com/fangjins/archive/2012/05/06/2485459.html 一.背景介绍 对于初学者,用maven构建项目并不是一件容易 ...

  7. hdu1269迷宫城堡 (强连通Tarjan+邻接表)

    Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每一个通道都是单向的,就是说 ...

  8. UBUNTU 14.04 INSTALL nsenter

    cd /tmp; curl https://www.kernel.org/pub/linux/utils/util-linux/v2.25/util-linux-2.25.tar.gz | tar - ...

  9. ZooKeeper目录

    1. Zookeeper常用命令 (转) 2. ZooKeeper安装和配置(转) 3. Spark集群基于Zookeeper的HA搭建部署笔记(转)

  10. SQL Server会话KILL不掉,一直处于KILLED /ROLLBACK状态情形浅析[转]

    本文将为您描述SQL Server会话KILL不掉,一直处于KILLED /ROLLBACK状态情形浅析,教程操作方法: 今天遇到一个很奇怪的情况,发现一个会话异常,这个会话只是在执行一个简单的存储过 ...