C# 中的结构类型(struct type)
ylbtech- .NET-Basic:C# 中的结构类型(struct type) |
C# 中的结构类型(struct type)
1.A,相关概念返回顶部 |
public struct Book { public decimal price; public string title; public string author; }
结构对于具有值语义的小型的数据结构特别有用。复数、坐标系中的点或字典中的“键-值”对都是结构类型的典型示例。对小型数据结构而言,使用结构而不是用类会大大节省应用程序分配的量。例如,下面的程序创建并初始化一个含有 100 个点的数组。对于作为类实现的 Piont,出现了 101 个实例对象,其中,数组需要一个,它的 100 个元素每一个都需要一个,具体情况看下例:
//使用类进行“键-值”对的应用 using System; namespace Test { class Piont { public int x, y; public Piont(int x, int y) { this.x = x; this.y = y; } } class PiontClass { static void Main() { Piont[] pionts = new Piont[100]; for (int i = 0; i < 100; i++) pionts[i] = new Piont(i, i); } } }
一种替代办法是将 Piont 定义为结构。
struct Piont { public int x, y; public Piont(int x, int y) { this.x = x; this.y = y; } }
替换后,示例如下:
//使用 struct 后的示例 using System; namespace Test { struct Piont { public int x, y; public Piont(int x, int y) { this.x = x; this.y = y; } } class PiontClass { static void Main() { Piont[] pionts = new Piont[100]; for (int i = 0; i < 100; i++) pionts[i] = new Piont(i, i); } } }
现在,只有一个对象被实例化(即用于数组的那个对象),而 Piont 实例以值的形式直接内联存储在数组中。
结构构造函数也是使用 new 运算调用,但是这并不意味着会分配内存。与动态分配对象并返回对它的引用不同,结构构造函数直接返回构造值本身(通常是堆栈上的一个临时位置),然后根据需要复制该结构值。
对于类,两个变量可能引用同一对象,因此对一个变量进行操作可能影响另一个变量所引用的对象。对于结构,每个变量都有自己的数据副本,对一个变量操作不可能影响另一个变量。下面的代码段产生的输出取决于 Piont 是类还是构造。
Piont a = new Piont(10,10);
Piont b= a;
a.x = 20;
Console.WriteLine(b.x);
如果 Piont 是类,将输出是 20,因为 a 和 b 引用同一对象。如果 Piont 是结构,输出将是 10,因为将 a 对 b 的赋值创建了该值的一个副本,因此接下来对 a.x 的赋值不会影响 b 这一副本。
前一示例突出了结构的两个限制。首先,赋值整个结构常数不如复制对象引用的效率高,因此结构类型的赋值和值参数传递可能比引用类型的开销更大。其次,除了 ref 和 out 参数,不可能创建对结构的引用,这样限制了结构的应用范围。
结构还可以包含构造函数、常量、字段、方法、属性、索引器、运算符、事件和嵌套类型,但如果同时需要上述几种成员,则应当考虑改为使用类作为类型。
结构可是实现接口,但它们无法继承另一个结构。因此,结构成员无法声明为 protected。
![]() |
作者:ylbtech 出处:http://ylbtech.cnblogs.com/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决