C# 中的结构类型(struct)
简介
有时候,类中只包含极少的数据,因为管理堆而造成的开销显得极不合算。这种情况下,更好的做法是使用结构(struct)类型。由于 struct 是值类型,是在栈(stack)上存储的,所以能有效的减少内存管理的开销(当然前提是这个结构足够小)。
结构可以包含它自己的字段、方法和构造器。
int 实际上是 Sysytem.Int32 结构类型。
默认构造器(构造函数)
编译器始终会生成一个默认的构造器,若自己写默认构造器则会出错(默认构造器始终存在)。自己只能写非默认构造器,并且在自己写的构造器中初始化所有字段。
struct Time { public Time() { // 编译时错误:Structs cannot contain explicit parameterless constructors } } struct NewYorkTime { private int hours, minutes, seconds; public NewYorkTime(int hh, int mm) { hours = hh; minutes = mm; } // 编译时错误,因为 seconds 未初始化 }
可以使用 ? 修饰符创建一个结构变量的可空(nullable)的版本。然后把 null 值赋给这个变量。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace structType { class Program { static void Main(string[] args) { NewYorkTime? currentTime = null; // 结构类型也是值类型,可以声明为可空 } } struct NewYorkTime { private int hours, minutes, seconds; public NewYorkTime(int hh, int mm) { hours = hh; minutes = mm; seconds = 0; } } }
默认构造器不需要也不能自己定义,默认构造器会把所有的自动初始化为 0 。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace structType { class Program { static void Main(string[] args) { Time now = new Time(); // 调用默认构造器,从而自动初始化,所有字段为 0 } } struct Time { private int hours, minutes, seconds; } }
字段(field)值如下:
下面这种方式,结构将不会被初始化,但是也不能访问。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace structType { class Program { static void Main(string[] args) { Time now; // 不进行初始化,若访问字段的值会造成编译错误 } } struct Time { private int hours, minutes, seconds; } }
字段(field)值如下
自定义构造器
自己定义的构造器必须在构造器内把所有的字段初始化。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace structType { class Program { static void Main(string[] args) { Time now = new Time(12, 30); } } struct Time { private int hours, minutes, seconds; public Time(int hh, int mm) { hours = hh; minutes = mm; seconds = 0; } } }
字段(field)值如下
结构中的字段不能在声明的同时进行初始化。
struct Time { private int hours = 0; // 报错 'Time.hours': cannot have // instance field initializers in structs private int minutes, seconds; public Time(int hh, int mm) { hours = hh; minutes = mm; seconds = 0; } }
你们的评论、反馈,及对你们有所用,是我整理材料和博文写作的最大的鼓励和唯一动力。欢迎讨论和关注!
没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。
没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通