struct 类型是一种值类型,通常用来封装小型相关变量组,例如,矩形的坐标或库存商品的特征。 下面的示例显示了一个简单的结构声明:

public struct Book
{public decimal price;public string title;public string author;
}

结构还可以包含构造函数、常量、字段、方法、属性、索引器、运算符、事件和嵌套类型,但如果同时需要上述几种成员,则应当考虑改为使用类作为类型。

一、结构

通过使用结构关键字来定义结构,例如:

public struct PostalAddress
{// Fields, properties, methods and events go here...
}

结构与类的大部分语法相同。 结构名称必须是有效的 C# 标识符名称。 结构在以下方面比类的限制更多:

  • 在结构声明中,除非将字段声明为 const 或 static,否则无法初始化。
  • 结构不能声明无参数构造函数(没有参数的构造函数)或终结器。
  • 结构在分配时进行复制。 将结构分配给新变量时,将复制所有数据,并且对新副本所做的任何修改不会更改原始副本的数据。 在处理值类型的集合(如 Dictionary<string, myStruct>)时,请务必记住这一点。
  • 结构是值类型,不同于类,类是引用类型。
  • 与类不同,无需使用 new 运算符即可对结构进行实例化。
  • 结构可以声明具有参数的构造函数。
  • 一个结构无法继承自另一个结构或类,并且它不能为类的基类。 所有结构都直接继承自 ValueType,后者继承自 Object。
  • 结构可以实现接口。
  • 结构不能为 null,并且不能向结构变量分配 null,除非将变量声明为可为 null 的类型。

二、使用结构

struct 类型适用于表示轻量级对象,如 Point、 Rectangle和 Color。 尽管用它来表示一个点就如同具有 Auto-Implemented Properties(自动实现的属性) 的 类那样方便,但在某些情况下,使用 结构 可能更高效。 例如,如果你声明具有 1000 个 Point 对象的数组,那么你将分配额外的内存用于引用每个对象;在这种情况下,使用结构将更为便宜。 因为 .NET Framework 包含一个名为 Point 的对象,所以本示例中的结构名称为“Coords”。

public struct Coords
{public int x, y;public Coords(int p1, int p2){x = p1;y = p2;}
}

定义结构的默认(无参数)构造函数是错误的。 在结构体中初始化实例字段也是错误的。 只能通过使用参数化构造函数、隐式、无参数构造函数、对象初始值设定项或在声明结构后单独访问成员来初始化外部可访问的结构成员。 任何私有或其他不可访问的成员需要以独占方式使用构造函数。

使用 new 运算符创建结构对象时,会创建结构对象且会遵循构造函数签名来调用相应的构造函数。 与类不同,可以对结构进行实例化,而无需使用 new 运算符。在这种情况下,没有调用任何构造函数,从而提高了分配效率。 但是,字段将保持为未分配状态且必须在在初始化所有字段之后才可使用对象。 这包括无法通过属性获取或设置值。

如果使用默认的无参数构造函数实例化结构对象,则根据成员的默认值分配所有成员。

当为某个结构编写带有参数的构造函数时,必须显式初始化所有成员,否则一个或更多的成员将不被分配,并且不能使用结构,这会生成编译器错误 CS0171。

由于全都是用于类的继承,因此没有用于结构的继承。 一个结构无法继承自另一个结构或类,并且它不能为类的基类。 但是,它可以从基类 Object继承。 结构也可以实现接口,且实现方法与类相同。

不能使用关键字 struct声明一个类。 在 C# 中,类和结构在语义上是不同的。结构是值类型,而类是引用类型。 有关更多信息,请参阅 值类型。

除非需要引用类型语义,将较小的类声明为结构,可以提高系统的处理效率。

示例一

此示例同时使用了默认构造函数和参数化构造函数来演示 struct 初始化。

代码:

public struct Coords
{public int x, y;public Coords(int p1, int p2){x = p1;y = p2;}
}
// Declare and initialize struct objects.
class TestCoords
{static void Main(){// Initialize.var coords1 = new Coords();var coords2 = new Coords(10, 10);// Display results.Console.Write("Coords 1: ");Console.WriteLine($"x = {coords1.x}, y = {coords1.y}");Console.Write("Coords 2: ");Console.WriteLine($"x = {coords2.x}, y = {coords2.y}");// Keep the console window open in debug mode.Console.WriteLine("Press any key to exit.");Console.ReadKey();}
}
/* Output:Coords 1: x = 0, y = 0Coords 2: x = 10, y = 10
*/

示例二

此示例演示了一个特定于结构的功能。 此功能可以创建 Coords 对象,而无需使用 new 运算符。 如果将 struct 替换为 class,程序将不会进行编译。

代码:

public struct Coords
{public int x, y;public Coords(int p1, int p2){x = p1;y = p2;}
}
// Declare a struct object without "new".
class TestCoordsNoNew
{static void Main(){// Declare an object.Coords coords1;// Initialize.coords1.x = 10;coords1.y = 20;// Display results.Console.Write("Coords 1: ");Console.WriteLine($"x = {coords1.x}, y = {coords1.y}");// Keep the console window open in debug mode.Console.WriteLine("Press any key to exit.");Console.ReadKey();}
}
// Output: Coords 1: x = 10, y = 20

struct——结构体相关推荐

  1. 1.0 基础、标示符、常量、数据类型(enum 枚举,struct 结构体)、操作符、循环、数组...

    一.程序 现实生活中,程序是指完成某些事务的一种既定方法和过程,可以把程序看成是一系列动作执行过程的描述. 在计算机世界,程序是指令,即为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的集 ...

  2. c/c++教程 - 1.10 结构体 使用typedef定义struct结构体 结构体数组 结构体指针 结构体嵌套 结构体做函数参数 结构体const

    十二.结构体 (1)结构体定义和使用 基本概念:结构体属于用户自定义的数据类型,允许用户存储不同的数据类型. 参考视频:https://www.bilibili.com/video/BV1et411b ...

  3. C/C++中struct结构体定义变量的3种方法及初始化

    本博客整理自http://blog.csdn.net/zunfo/article/details/51494631 1.struct结构体定义 1.1.先定义结构体,然后再定义结构体变量 struct ...

  4. Go语言核心之美 3.4-Struct结构体

    struct(结构体)也是一种聚合的数据类型,struct可以包含多个任意类型的值,这些值被称为struct的字段.用来演示struct的一个经典案例就是雇员信息,每条雇员信息包含:员工编号,姓名,住 ...

  5. Hive基础08、Hive引入Struct结构体

    Hive基础08.Hive引入Struct结构体 1.建表语句 创建一个温良贤淑女子的表 英文关键字解析: 1.CREATE TABLE 创建一个指定名字的表,如果库中已有相同名的表,则抛出异常: 用 ...

  6. struct结构体扩展-成员函数

    struct结构体扩展-成员函数 在C++中,允许在结构中定义函数,该函数被称为成员函数,描述形式如下: struct 结构名{数据成员成员函数 } 例题描述: 输入n个学生的信息,每个学生信息包括姓 ...

  7. (转载)虚幻引擎3--【UnrealScript教程】章节一:11.Struct结构体

    UnrealScript struct是把一组变量一起塞入到一个新类型称为struct的超级变量的一种方法.UnrealScript structs和C语言中的结构体很像,它可以包含变量.数组及其它的 ...

  8. 597-Golang的类型声明、struct结构体

    类型声明 type name 定义type (name 定义name2 定义2 ) 因为本质上是int,默认值是0 因为本质上就是int类型,shuzi和int没有区别 type也可以批量化声明 st ...

  9. 定义struct结构体数组

    题目要求: 有3个候选人,每个选民只能投票选一人,要求编一个统计选票的程序,先后输入被选人的名字,最后输出各人得票结果. 解题思路: 设一个结构体数组,数组中包含3个元素 每个元素中的信息应包括候选人 ...

  10. C语言-轻松掌握|struct结构体|知识点

    目录 结构体的声明 1.结构体的基础知识 2.特殊的声明 3.结构体的自引用 了解数据结构-数据在内存的存储结构: 之前犯过一个错误案例 4.结构体变量的定义和初始化 定义和初始化​ 嵌套结构体​ 5 ...

最新文章

  1. 车辆检测--DAVE: A Unified Framework for Fast Vehicle Detection and Annotation
  2. Let Me Count The Ways(Kickstart Round H 2018)
  3. 当linkedin connection达到1500的时候的感受
  4. centos7 安装rabbitMQ3.6.6
  5. SQL Server 2014内存优化表的使用场景
  6. Java描述设计模式(16):代理模式
  7. 微软正准备一个简易的Rootkit清除方案 助用户打补丁
  8. axios文件上传 formdata_基于业务场景下的图片/文件上传方案总结
  9. python基本数据类型(字节字符十进制十六进制二进制转换)
  10. JavaScript 获取GET中的值
  11. IOS开发学习笔记(一)——ObjectC语言快速入门
  12. 设计模式23模式介绍
  13. 电脑怎么用计算机打开指令,电脑常用快捷键及命令
  14. 微服务可用性设计(二):过载保护,限流
  15. 亚马逊云服务器账号注册,免费申请12个月aws亚马逊云详细教程
  16. Excel批量根据银行卡号查询银行卡的详细信息
  17. 年薪120W的架构师简历你见过吗?java程序员该如何达到?
  18. Foundry 中文文档发布啦
  19. python数据分析师 前景_数据分析师的前景怎么样? 本人是程序员,最近对数据分析有兴趣……...
  20. mp4视频测试地址url

热门文章

  1. 下载 GitHub的代码:git(windows)
  2. 国盛源投资量化买卖一定会挣钱吗?量化买卖怎样挣钱的?
  3. 端口复用|端口重映射
  4. html背景多图片拼接,将多个图片整合到一张图片中再用css_进行网页背景定位.
  5. kali修改用户名与密码
  6. html 定义列表dddt,DDD - 概述 - (一)
  7. luoguP3397 地毯
  8. Environment Variables
  9. php sid打印不出来,pinpoint php 使用不当引发棘手的问题 --psid sid tid pname ptype ah
  10. MATLAB设计控制系统仿真实验,基于MATLAB的自动控制原理实验仿真系统的设计