C#结构体(Struct)详解

在 C# 中,‌结构体(struct)‌ 是一种值类型数据类型,适用于封装小型数据组。与类(class)不同,结构体在栈(Stack)上分配内存,且赋值时会发生值复制。以下是结构体的核心特性和用法:


‌结构体核心特点‌
结构提供了一种轻量级的数据类型,适用于表示简单的数据结构,具有较好的性能特性和值语义:

  • 值类型‌:赋值时复制整个数据,修改副本不影响原数据。
  • 结构可带有方法、字段、索引、属性、运算符方法和事件,适用于表示轻量级数据的情况,如坐标、范围、日期、时间等。
  • 结构可定义构造函数,但不能定义析构函数。但是,您不能为结构定义无参构造函数。无参构造函数(默认)是自动- 定义的,且不能被改变(C# 10 前不能定义无参构造器,所有字段需在构造器中初始化。)。
  • 与类不同,结构不能继承其他的结构或类。
  • 结构不能作为其他结构或类的基础结构。
  • 结构可实现一个或多个接口。
  • 结构成员不能指定为 abstract、virtual 或 protected。
  • 当您使用 New 操作符创建一个结构对象时,会调用适当的构造函数来创建结构。与类不同,结构可以不使用 New 操作符即可被实例化。
  • 如果不使用 New 操作符,只有在所有的字段都被初始化之后,字段才被赋值,对象才被使用。
  • 结构变量通常分配在栈上,这使得它们的创建和销毁速度更快。但是,如果将结构用作类的字段,且这个类是引用类型,那么结构将存储在堆上。
  • 结构默认情况下是可变的,这意味着你可以修改它们的字段。但是,如果结构定义为只读,那么它的字段将是不可变的。

‌结构体 vs 类‌

特性结构体(struct)类(class)
类型值类型(栈内存)引用类型(堆内存)
继承不支持支持
默认构造器C# 10 前无隐式无参构造器有隐式无参构造器
赋值行为复制值复制引用
适用场景小型、频繁创建的数据复杂对象、需要继承的场景

‌结构体定义示例‌

public struct Point
{public int X;public int Y;// C# 10+ 允许显式无参构造器public Point(){X = 0;Y = 0;}public Point(int x, int y){X = x;Y = y;}public void Print() => Console.WriteLine($"({X}, {Y})");
}

‌使用结构体‌

// 创建结构体实例
Point p1 = new Point(10, 20);
Point p2 = p1; // 值复制p2.X = 30;     // 修改副本不影响原数据
p1.Print();     // 输出: (10, 20)
p2.Print();     // 输出: (30, 20)// 使用无参构造器(C# 10+)
Point p3 = new Point();
p3.Print();     // 输出: (0, 0)

‌何时使用结构体?‌

  1. 数据量小‌:字段较少(通常少于 16 字节)。
  2. 不可变需求‌:设计为不可变类型(所有字段只读)。
  3. ‌避免装箱‌:减少值类型与引用类型转换的性能损耗。
  4. ‌高频实例化‌:如游戏中的坐标计算,减少堆内存压力。

‌注意事项‌

  • 避免大型结构体‌:复制成本高,可能降低性能。
  • ‌慎用可变结构体‌:修改副本可能导致预期外的行为。
  • ‌构造器必须初始化所有字段‌:否则编译报错。
  • ‌实现接口需谨慎‌:可能导致装箱操作(将结构体转为 object 或接口类型时)。

通过合理使用结构体,可以优化内存分配和程序性能,但需根据场景权衡值与引用类型的优缺点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/72140.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UVC摄像头命令推流,推到rv1126里面去

ffmpeg命令查询UVC设备 .\ffmpeg.exe -list_devices true -f dshow -i dummy 上图是查询UVC设备的效果图,画红框的部分是UVC设备的设备名称"USB2.0 PC CAMERA"和设备号 "device_pnp_\\?\usb#vid_1908&pid_2310&mi_00#8&39abfe5&0&a…

Linux中的基本指令(上)

目录 ls指令 判断linux中文件 pwd指令 认识路径 ​编辑 绝对路径/相对路径 cd指令 简要理解用户 理解家目录 echo指令和printf指令 touch指令 mkdir指令 cat指令 tree指令 rmdir指令和rm指令 man指令 cp指令 which指令 alias 指令 date指令 cal指令 理解…

多数元素——面试经典150题(力扣)

题目 给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入:nums [3,2,3] 输出:3 …

Qt 数据库操作(Sqlite)

数据库简介 关于数据库的基础知识这里就不做介绍了,相关博客可以查看: SQL基础知识 数据库学霸笔记 上面博客都写的比较详细,本文主要介绍如何使用Qt进行数据库相关操作,数据库分为关系型数据库和非关系型数据,关系…

网络安全 api 网络安全 ast技术

随着应用或者API被攻击利用已经越来越多,虽然来自开源组件的漏洞加剧了这一现象的发生,但是,其实主要还是在于应用程序或者API本身没有做好防范,根源在于源代码本身的质量没有严格把控。AST是指Application Security Testing&…

Mac 配置 Maven JDK

不使用 Homebrew,创建指定版本 JDK 1、官网下载指定版本并安装……省略 2、vi ~/.zshrc 同时要检查 bash_profile 是否存在。 if [ -f ~/.bash_profile ] ; thensource ~/.bash_profile fiJAVA_HOME_11/Library/Java/JavaVirtualMachines/jdk-11.0.1…

【每日学点HarmonyOS Next知识】拖拽调整列表顺序、tab回弹、自定义弹窗this、状态变量修饰枚举

1、HarmonyOS 功能实现(拖拽调整列表顺序)? 可参考: import curves from ohos.curves; import Curves from ohos.curvesEntry Component struct ListItemExample {State private arr: number[] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]…

Django部署Filemanagement

Pycharm搭建项目安装虚拟环境 mysqlclient对mysql的安装,配置有要求 pymsql伪装成mysqlclient,pymysql可以操纵mysql pip install pymysql操作sql5.7 mysql8.0会出现与pycharm不兼容问题,会报错,所以降到5.7 # 进入mysql 需要…

【病毒分析】熊猫烧香病毒分析及其查杀修复

目录 前言 一、样本概况 1.1 样本信息 1.2 测试环境及工具 1.3 分析目标 二、具体行为分析 2.1 主要行为 2.1.1 恶意程序对用户造成的危害 2.2 恶意代码分析 2.2.1 加固后的恶意代码树结构图(是否有加固) 2.2.2 恶意程序的代码分析片段 三、解决方案(或总结) 3.1 …

Spring Boot集成Spring Statemachine

Spring Statemachine 是 Spring 框架下的一个模块,用于简化状态机的创建和管理,它允许开发者使用 Spring 的特性(如依赖注入、AOP 等)来构建复杂的状态机应用。以下是关于 Spring Statemachine 的详细介绍: 主要特性 …

数组总和 (leetcode 40

leetcode系列 文章目录 一、核心操作二、外层配合操作三、核心模式代码总结 去重方式和之前三数之和一样,也可以用used数组去重,但本次尝试使用set去重 一、核心操作 如果count为0了,则证明正好减到了0,就可以收获,…

sqli-lab靶场学习(八)——Less26-28

前言 25关已经出现了初步的一些关键字过滤,通过双写可以绕过。后面的关卡,我们会遇到更多关键字过滤,需要各种技巧绕过。 Less26 第26关写了会过滤空格和注释符。有很多的答案,会用%a0替代空格,但据说这是sqli-labs部…

python:VOC格式数据集转换为YOLO数据集格式

作者:CSDN _养乐多_ 本文将介绍如何将目标检测中常用的VOC格式数据集转换为YOLO数据集,并进行数据集比例划分,从而方便的进行YOLO目标检测。 如果不想分两步,可以直接看第三节代码。 文章目录 一、将VOC格式数据集转换为YOLO格…

Docker容器安装软件(完整版)

文章目录 一、安装Docker1.1 docker 相关的命令1.2 配置镜像加速 二. 安装es2.1 创建网络2.2 拉取镜像2.3 创建挂载点目录2.4 部署单点es,创建es容器2.5 编写elasticsearch.yml2.6 重启es容器2.7 测试Elasticsearch是否安装成功 三. 基于Docker安装Kibana3.1 拉取镜…

LINUX 指令大全

Linux服务器上有许多常用的命令,可以帮助你管理文件、目录、进程、网络和系统配置等。以下是一些常用的Linux命令: 文件和目录管理 ls:列出当前目录中的文件和子目录 bash lspwd:显示当前工作目录的路径 bash pwdcd:切…

燃气对我们生活的重要性体现在哪里?

燃气在我们的生活中有 多方面的重要性 ,以下是燃气对我们生活的重要性的详细说明: 烹饪和热水供应 : 燃气是家庭烹饪的主要能源,能够快速、高效地加热食物,使家庭聚餐更加便捷和愉快。 燃气热水器能够在短时间内提供…

NetAssist 5.0.14网络助手基础使用及自动应答使用方案

以下是NetAssist v5.0.14自动应答功能的详细使用步骤: 一、基础准备: 工具下载网址页面:https://www.cmsoft.cn/resource/102.html 下载安装好后,根据需要可以创建多个server,双击程序图标运行即可,下面…

node.js-node.js作为服务器,前端使用WebSocket(单个TCP连接上进行全双工通讯的协议)

1.WebSocket全双工通信协议 WebSocket是HTML5开始提供的一种单个TCP连接上进行全双工通讯的协议。让客户端和服务器间的数据交互变得简单,允许服务端向客户端主动推送数据。浏览器和服务器间只需要完成一次握手,两者间创建持久性的连接,并进行…

java后端开发day31--集合进阶(一)-----Collection集合List集合数据结构1

(以下内容全部来自上述课程) 1.集合体系结构 List系列集合:添加的元素是有序、可重复、有索引。 Set系列集合:添加的元素是无序、不重复、无索引。 2.Collection集合 Collection是单列集合的祖宗接口(不可直接创建…

Qt配置OpenGL相机踩的坑

项目根据LearnOpenGL配置Qt的相机,更新view矩阵和project矩阵的位移向量变得很大,我设置的明明相机位置是(0,0,3),理想的位移向量刚好是相反数(0,0,-3),对应的view矩阵位置向量可以变成(0,0,1200)…离模型非常远矩阵模型也看不见&…