C# 结构体与类的区别是什么?

结构体是值类型是储存在栈中独立储存的,数据与数据之间不会相互影响,即使将一个结构体赋值给另外一个结构体也不会相互影响。

类是一个模板,实例出来的对象是独立的不会相互影响,但是将一个对象赋值给另一个对象时 会把指向堆内存中数据的指针赋值给另一个对象.从而发生两个变量指向同一个堆内存 一个修改数据 另外一个也修改。

目录

1. 数据类型本质

2. 默认继承行为

3. 实例化方式

4. 默认成员初始化

5. 构造函数特性

6. 内存管理与生命周期

7. 比较行为

8. 适用场景

总结对比表


在 C# 等面向对象编程语言中,结构体(Struct)和类(Class)是两种重要的数据类型,它们在内存管理、行为特性等方面存在显著区别。以下从多个维度详细说明二者的核心差异:

1. 数据类型本质

  • 结构体(Struct):属于值类型(Value Type),直接存储数据本身。
    内存分配在栈(Stack) 上(或作为引用类型的一部分嵌入在堆中),当结构体变量被赋值、传递时,会创建完整的副本
  • 类(Class):属于引用类型(Reference Type),存储的是数据的引用(地址)。
    内存分配在堆(Heap) 上,变量仅保存指向堆中数据的指针,赋值或传递时仅复制引用(不会复制数据本身)。
  • 类实例化出的对象(即类的实例)存储在堆(Heap)中,而指向该对象的引用(变量)则存储在栈(Stack)中。

2. 默认继承行为

  • 结构体:默认继承自 System.ValueType(间接继承自 object),但不能继承其他类或结构体,也不能被其他类继承( sealed 特性)。
    支持实现接口。
  • :默认继承自 object可以继承其他类(单继承),也可以被其他类继承(除非声明为 sealed)。
    同样支持实现接口。

3. 实例化方式

  • 结构体
    • 可以不使用 new 关键字实例化(此时成员变量为默认值,如 int 为 0)。
    • 例如:Point p; p.X = 10;Point 是结构体)。
    • 使用 new 时,会调用构造函数初始化成员。
    • 必须使用 new 关键字调用构造函数实例化(否则变量为 null,直接访问成员会报错)。
    • 例如:Person p = new Person();Person 是类)。

4. 默认成员初始化

  • 结构体
    • 不能在声明时为成员变量设置默认值(需在构造函数中初始化)。
    • 例如:struct Point { public int X = 0; }(编译错误)。
    • 可以在声明时为成员变量设置默认值。
    • 例如:class Person { public int Age = 18; }(合法)。

5. 构造函数特性

  • 结构体
    • 无默认无参构造函数(编译器不会自动生成,若手动定义构造函数,必须为所有成员赋值)。
    • 例如:struct Point { public int X; public Point(int x) { X = x; } }(合法,因初始化了所有成员)。
    • 编译器会自动生成默认无参构造函数(若未手动定义任何构造函数)。
    • 可以定义有参构造函数,且无需显式初始化所有成员(未初始化的成员为默认值)。

6. 内存管理与生命周期

  • 结构体
    • 生命周期与所在作用域一致(如方法内的结构体变量,方法执行结束后栈内存自动释放)。
    • 无需垃圾回收(GC),性能开销较低(适合小型数据结构)。
    • 实例在堆上分配,生命周期由 GC 管理(当没有引用指向时,会被 GC 回收)。
    • 存在 GC 开销,适合大型、复杂的对象(如业务实体)。

7. 比较行为

  • 结构体
    • 默认按值比较(比较所有成员是否相等)。
    • 例如:两个 Point 结构体,若 X 和 Y 分别相等,则认为相等。
    • 默认按引用比较(比较是否指向堆中同一个实例)。
    • 例如:两个 Person 类实例,即使成员完全相同,若引用不同则认为不相等(需重写 Equals 方法实现值比较)。

8. 适用场景

  • 结构体
    • 适合表示小型、简单的数据(如坐标 Point、颜色 Color、日期 DateTime 等)。
    • 强调数据的值语义(传递时需要副本),且无需继承或多态特性。
    • 适合表示复杂的对象(如 UserOrder 等业务实体)。
    • 需要继承、多态,或实例较大、需要长期存在(通过引用共享)的场景。

总结对比表

特性结构体(Struct)类(Class)
数据类型值类型引用类型
内存分配栈(或嵌入堆)
赋值 / 传递行为复制值(副本)复制引用(共享实例)
继承不能继承 / 被继承(除接口)支持继承和被继承
实例化可省略 new必须用 new
成员默认值不允许声明时初始化允许声明时初始化
构造函数无默认无参构造函数,需初始化所有成员有默认无参构造函数,可部分初始化
比较方式默认值比较默认引用比较
适用场景小型简单数据,值语义复杂对象,引用语义,需继承多态

通过以上区别可以看出,结构体和类的选择主要取决于数据的复杂度、是否需要共享引用以及是否依赖继承多态等特性。

C# 结构体https://blog.csdn.net/LZQqqqqo/article/details/149511030?spm=1001.2014.3001.5502C# 面向对象__类_对象https://blog.csdn.net/LZQqqqqo/article/details/149546454?spm=1001.2014.3001.5502

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

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

相关文章

Redis GEO

Redis GEO 引言 Redis 是一款高性能的键值存储系统,广泛应用于缓存、消息队列等领域。Redis GEO 是 Redis 2.4 版本后新增的一个功能,用于存储地理位置信息。本文将详细介绍 Redis GEO 的概念、使用方法以及应用场景。 什么是 Redis GEO? Redis GEO 是 Redis 的一个模块…

Go从入门到精通系列学习路线规划

Go从入门到精通系列学习路线规划 目录导航 Go从入门到精通系列学习路线规划首页说明 第1篇_Go语言初探_环境搭建与HelloWorld 第2篇_Go语言基础语法_变量常量与数据类型 第3篇_Go语言控制结构_条件判断与循环 第4篇_Go语言函数详解 第5篇_Go语言数据结构详解 第6篇_Go语言结构体…

Grid系统概述

目录 概念及功能 网格对象(Grid Object) 和世界对象(World Object) 工作流程 概念及功能 TrinityCore 的 Grid 系统是一套复杂的地图分区管理机制,其核心目标是通过动态管控游戏世界的区域状态和对象生命周期&#…

一文搞懂LLM大模型!LLM从入门到精通万字长文(2024.12月最新)

LLM从入门到精通精品文章 目录 一、LLM基本概念 二、LLM发展历程 三、LLM大模型的分类 四、LLM主流大模型类别 五、LLM大模型建立的流程 六、Fine-Tuning 七、Prompt-Tuning 八、超大规模参数模型Prompt-Tuning方法 8.1上下文学习 In-Context Learning 8.2.指令学习 …

Next.js跟React关系(Next.js是基于React库的全栈框架)(文件系统路由、服务端渲染SSR、静态生成SSG、增量静态再生ISR、API路由)

文章目录**1. React 是基础,Next.js 是扩展****2. Next.js 解决了 React 的哪些痛点?****3. 核心区别****4. Next.js 的核心特性**1. **文件系统路由**2. **服务端渲染(SSR)**3. **静态生成(SSG)**4. **增量…

Nightingale源码Linux进行跨平台编译

最近使用Nightingale 需要实现对服务的监测,想要在Windows 系统中使用,看官方文档中并不直接提供执行程序,原文如下: 准备工作 本地环境 本地已经安装git 本地安装git 便于后续下载源码并进行自动编译。 Linux操作系统环境&…

抽丝剥茧丨PostgreSQL 系国产数据库%SYS CPU newfstatat() high 调优一例(二)

续接上回《PostgreSQL 系国产数据库%SYS CPU newfstatat() high 调优一例(一)》,这个问题还在持续,并且原因并不只是一个,从调了文件系统级atime,到调整wal size减少日志被动清理,还有在验证tem…

【新手入门】Android Studio 项目结构拆解,快速理解文件作用!

目 录 一、【Project】视图下项目结构(真实目录) 二、【Android】视图下项目结构 三、【app/】下重要文件解析 1、 build.gradle 2、AndroidManifest.xml 3、res/ 作为刚刚接触Android开发的小白,使用Android Studio创建项目后&…

Python实现点云Kmeans、欧式和DBSCAN聚类

本节我们分享点云处理中的三种常见聚类方法,分别是K-means、欧氏与 DBSCAN聚类。具体介绍如下:1. K-means 聚类定义:一种基于距离度量的无监督学习算法,将数据划分为 K 个紧凑的簇,使簇内数据相似度高、簇间差异大。算…

【Java后端】MyBatis-Plus 原理解析

MyBatis-Plus 原理解析 其实 MyBatis-Plus 的 Service 层设计就是为了让开发者不用重复写很多样板代码。我们来一点点剖析 UserServiceImpl、IService、UserService、ServiceImpl 之间的关系和调用链。1. 类/接口关系图IService<T>▲│UserService (接口) <-- 自定义…

Nacos 注册中心学习笔记

&#x1f389; Alibaba微服务组件 Nacos 注册中心超详细学习笔记 &#x1f389; &#x1f4cc; 写在前面&#xff1a;本文基于官方PDF文档与实战经验&#xff0c;整理了Nacos注册中心的核心知识点、部署流程与实战技巧&#xff0c;力求图文并茂、通俗易懂&#xff0c;适合收藏反…

java 策略模式 demo

策略模式介绍策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一系列算法&#xff0c;将每个算法封装起来并使它们可相互替换。策略模式让算法的变化独立于使用算法的客户端&#xff0c;从而实现灵活的算法切换。核心角色&#xff1…

SAP Valuation Category在制造业成本核算中的使用场景与配置方案

Valuation Category在制造业成本核算中的使用场景与配置方案一、核心使用场景&#xff08;制造业特有&#xff09;1. 内制 vs 外购成本分离业务需求&#xff1a;同一物料可能通过内部生产&#xff08;成本含料工费&#xff09;或外部采购&#xff08;成本含采购价运费&#xff…

我的 LeetCode 日记:Day 36 - 动态规划,背包问题的千变万化

昨天&#xff0c;我初步掌握了 0/1 背包问题的理论基础和标准解法。今天&#xff0c;我将这种思想应用到了更广泛的场景中。今天的几道题&#xff0c;乍一看和背包没什么关系&#xff0c;但通过巧妙的数学转化&#xff0c;它们的核心都变成了 0/1 背包问题。 这让我深刻体会到…

本地处理不上传!隐私安全的PDF转换解决方案

PDF能锁定排版、字体、图片位置&#xff0c;无论在什么设备打开都保持一致。它是无广告、简洁高效的专业PDF处理工具。功能丰富&#xff0c;支持批量操作&#xff1a;只需将文件拖入界面&#xff0c;选择目标格式&#xff08;如Word、PPT、Excel、图片等&#xff09;&#xff0…

Docker build创建镜像命令入门教程

一、核心概念Dockerfile 定义镜像构建步骤的文本文件&#xff0c;包含一系列指令和配置&#xff0c;用于自动化创建镜像。镜像层&#xff08;Layer&#xff09; Docker 镜像由多层只读层叠加而成&#xff0c;每个指令&#xff08;如 RUN、COPY&#xff09;会生成一个新的层。层…

Redis 是单线程模型吗?

最近在面试中经常被问到这个问题&#xff1a;"Redis是单线程的吗&#xff1f;"很多同学都会脱口而出&#xff1a;"是的&#xff01;"但其实这个答案并不完全正确。今天我们就来聊聊Redis的线程模型&#xff0c;把这个问题彻底搞清楚。 先说结论 Redis的线程…

Hologres实战:路径分析函数

前言 Hologres提供了一套高效的路径分析函数&#xff0c;包括路径明细计算和结果解析功能&#xff0c;能够帮助用户深入理解用户行为路径&#xff0c;并通过桑基图实现数据可视化。 一、核心功能 路径明细计算&#xff1a;精确记录用户在产品或功能中的完整访问路径结果解析…

产品开发实践(常见的软硬结合方式)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】前面说过&#xff0c;传统的纯软件开发&#xff0c;在国内的大背景下面是很难存活的。但是如果是把软件&#xff0c;构建在硬件基础之上&#xff0c…

Linux | i.MX6ULL网络通信-套字节 UDP(第十八章)

01 Linux | i.MX6ULL网络通信-套字节 TCP(第十七章) 02 iTOP-IMX6ULL 实现基于 UDP 的 socket 编程。