深入理解 C# 中的值类型与引用类型

unity面试题整理----50道常见 unity面试题整理 阅读详情

在 C# 编程中,值类型和引用类型是两种核心的数据类型分类,它们在内存分配、数据存储和传递方式上有本质差异。掌握这两种类型的特性,能够帮助开发者写出更加高效、稳定的代码。

一、内存分配的本质差异

C# 程序运行时,内存分为两大区域:栈(Stack)和堆(Heap)。

  • 栈:存储临时数据,容量小,访问速度快。遵循“后进先出”的原则,适用于局部变量。

  • 堆:存储长期存在的数据,容量大,访问速度相对较慢。由垃圾回收器(GC)管理内存回收。

二、值类型(Value Type):数据即本身

1. 定义与核心特性

值类型变量直接包含数据本身,数据存储在栈上(或作为引用类型对象的一部分存储在堆中)。每个值类型都有独立的副本,修改一个变量不会影响另一个。

核心特性:

  • 数据独立:每个变量都有自己的数据副本。

  • 内存自动释放:超出作用域后,栈内存自动回收。

  • 默认值:C# 默认给定初始值(如 int 为 0,bool 为 false)。

  • 不可为 null:默认情况下,值类型不能为 null。可以通过 Nullable<T> 来实现可空值类型。

2. C# 中的值类型分类
  • 基本值类型:如 int、float、char、bool、decimal 等。

  • 自定义值类型:如 struct(结构体)、enum(枚举)。

示例:值类型的行为演示
// 基本值类型示例
int a = 10;
int b = a; // 复制a的数值,b拥有独立副本
b = 20;    // 修改b不会影响a
Console.WriteLine(a); // 输出:10
Console.WriteLine(b); // 输出:20

// 自定义结构体(值类型)
struct Point
{
    public int X;
    public int Y;
}

Point p1 = new Point { X = 1, Y = 2 };
Point p2 = p1; // 复制p1的所有数据
p2.X = 10;     // 修改p2的X,p1不受影响
Console.WriteLine(p1.X); // 输出:1
Console.WriteLine(p2.X); // 输出:10

三、引用类型(Reference Type):变量是指针

1. 定义与核心特性

引用类型变量存储指向堆中数据的“引用地址”,而非数据本身。当创建引用类型对象时,数据存储在堆中,栈上仅存储指向该数据的指针。

核心特性:

  • 数据共享:多个变量可以指向同一个堆对象,修改一个变量会影响其他引用该对象的变量。

  • GC 回收:当引用类型对象不再被引用时,GC 会自动回收内存。

  • 可为 null:引用类型变量可以为 null,表示不指向任何对象。

2. C# 中的引用类型分类
  • 核心引用类型:如 class(类)、delegate(委托)、interface(接口)、array(数组)、object(所有类型的基类)和 string(字符串)。

示例:引用类型的行为演示
// 基本值类型示例
int a = 10;
int b = a; // 复制a的数值,b拥有独立副本
b = 20;    // 修改b不会影响a
Console.WriteLine(a); // 输出:10
Console.WriteLine(b); // 输出:20

// 自定义结构体(值类型)
struct Point
{
    public int X;
    public int Y;
}

Point p1 = new Point { X = 1, Y = 2 };
Point p2 = p1; // 复制p1的所有数据
p2.X = 10;     // 修改p2的X,p1不受影响
Console.WriteLine(p1.X); // 输出:1
Console.WriteLine(p2.X); // 输出:10

四、值类型与引用类型的核心对比

特性值类型引用类型
内存存储位置栈(或作为引用类型成员在堆中)数据在堆,引用在栈
变量存储内容实际数据堆数据的引用地址
赋值行为复制数据副本,相互独立复制引用地址,指向同一对象
默认值类型默认值(如 int = 0)null
内存回收超出作用域自动释放(栈)GC 回收(堆)
可空性默认不可空,需 Nullable<T>可直接为 null
典型类型struct、enum、int、float 等class、delegate、array、string

五、实践中的选择原则

  • 优先选择值类型:

    • 数据量小、无继承需求、需要值语义时,选择 struct 或基本值类型。例如:坐标、金额、状态枚举。

  • 选择引用类型:

    • 数据量大、需要继承、需要共享状态时,选择 class。例如:复杂业务实体、数据模型。

  • 性能优化:

    • 频繁创建/销毁的大型值类型(如大结构体)可能导致栈溢出,建议改用引用类型。

    • 在传递引用类型时要小心空引用异常(null 检查)。

六、总结

  • 值类型:数据存储在栈中,具有独立副本,生命周期短,内存管理简单。

  • 引用类型:数据存储在堆中,多个变量可以指向同一对象,GC 管理内存回收。

理解这两种类型的差异,能够帮助你更好地管理内存、优化性能,并避免常见的逻辑错误。在开发中根据具体需求选择合适的类型,不仅能提高代码的可维护性,还能提升程序的运行效率。

深入理解C#中的值类型与引用类型 本文通过对C#中值类型和引用类型的区别进行详细探讨,帮助读者理解它们之间的行为差异和在实际编程中的应用。文章介绍了值类型不能赋值为null、引用类型具有引用语义、值类型具有值语义以及如何使用这些类型创建自定义类和对象。通过实例和案例分析,读者可以更好地掌握这些概念,并将理论应用于日常开发实践中。 阅读详情

相关推荐

PackML工业标准解析:统一机器状态管理与数据交换的实践指南

在工业自动化与智能制造领域,实现设备间的互联互通与高效协同是核心挑战。这背后依赖于一套标准化的机器行为与数据交换规范,其原理在于通过定义统一的状态模型与接口协议,消除不同厂商设备间的“语言”隔阂。这项技术的核心价值在于大幅降低系统集成复杂度、提升运维效率与生产透明度,是构建数字化工厂的基石。其典型应用场景包括包装机械、离散制造产线等需要多设备协同的领域。本文聚焦的PackML(包装机械语言)标准,正是这一理念的杰出实践,它通过一套严谨的**状态机模型**和**数据标签(PackTags)** 体系,为机器提

weixin_30070339的博客 399

C# Lesson 03 : C#数据类型--值类型

0 基础 C#语言的数据类型分为两种: 值类型 引用类型 值类型有 简单类型:整数(int)、浮点(float)、实数、字符型(char ' '注意是单引号)、布尔(bool) 复合类型:结构、枚举 引用类型: 类、接口、数组、委托 简单理解值类型就是说给你分配寄存器地址,让你在寄存器里存起来,调用的时候直接调用名称即可 引用类型,拿数组字符串来说,你调用变量名实际调用的是变量的首地址(C#还没学会,C也快忘光了) 一、整数类型 int类型的默认值为0 在int类型中,数..

baidu_39039998的博客 1399

用户视角下的vfsglobal预约困境:从注册到登录的全流程避坑指南

本文详细解析了vfsglobal签证预约系统从注册到登录的全流程操作,帮助用户避开常见技术陷阱。针对IP限制、DNS解析、浏览器缓存等登录障碍提供实用解决方案,并揭示账号管理的隐藏规则与支付环节的延时处理技巧,助力用户高效完成签证预约。

ol78901234的博客 871

引用和指针的区别

引用和指针的区别指针的介绍引用的引入意图引用的实现原理引用和指针使用时的区别 指针的介绍 指针是C中的一个概念,指针变量中存储的是一个变量的地址,在C语言中,指针最大的作用就是解决函数参数的传值的局限性了。没有指针,一个函数的作用仅仅体现在它对全局变量的修改和它的返回值中,有了指针,函数能实际改变传给它的参数,大大加强了函数的功能。 引用的引入意图 在过程式编程中,指针已经足够用了,但是随着面向对象的引入,指针的局限性就体现出来了。很多时候,我们希望能够给函数传入一个对象而非这个对象的指针,所以C++引入了

aha_bear的博客 544

Palantir解密:“本体”的建模逻辑及其扩展方向

上一篇重点从对现实世界建模的角度探讨了“本体”在数字化架构中的核心意义。这里借Palantir的“本体”概念、解析Palantir只是起点,目标旨在以他山之石攻玉——探索数字世界的底层架构逻辑,最终为构建自主体系提供思考。Palantir以“本体论”为核心的建模方案是否代表终极答案,不宜过早下结论,但其思路值得深入剖析。

SZSDQJC的博客 2632

识别产品外观的合格软件_工业视觉工业质检视觉识别机器视觉视觉检测智能制造工业检测缺陷...

随着工业物联网技术的迅猛发展,掀起了以云计算、大数据、以及人工智能 AI 等信息技术正与传统工业深入融合,由此衍生的 “智能制造4.0” 理念,正在为全球工业带来深远变革。中国的制造业巨头也纷纷借此发力,向智能化、数字化制造演进,实施战略转型。如何高效科学的管理和分析制造业务链上的生产价值,推进制造企业生产工艺优化与产品质量提升是每一个制造企业在数字化、智能化转型过程中的必经之路。业务发展带来的挑...

weixin_42502419的博客 751

C# 值类型

类型(Type)又叫数据类型(Data Type)。 A data type is a homogeneous collection of values,effectively prensented,equipped with a set of operations which manipulate these values. c#类型分为值类型和引用类型,值类型有结构体和枚举,引用类型有类、接口、委托。

sc_1313的博客 1940

【雕爷学编程】Arduino动手做(71)---红外遥控器及接收模块3

雕爷学编程,Arduino动手做,开源硬件,创客传感器,红外遥控器及接收模块

雕爷学编程 2285

C#数据类型(详细)

定义:指定一组函数成员而不实现成员的引用类型,其它类型和接口可以继承接口。接口使用interface关键字声明,它与类的声明类似。接口声明默认是 public 的。以上代码定义了接口 IMyInterface。通常接口命令以 I 字母开头,这个接口只有一个方法 MethodToImplement(),没有参数和返回值,当然我们可以按照需求设置参数和返回值。

Seike_113的博客 5296

【Claude】Disabled organization 错误:组织被禁用的原因与 API Key 绕过方法

如果环境变量存在,下一步是找出它在哪里被设置的。"Disabled organization" 错误的本质不是账户被封,而是认证优先级冲突。环境变量优先级最高始终覆盖 OAuth 订阅认证报错信息具有误导性:"组织被禁用"指的通常是 API Key 所属的组织,而不是你的个人账户旧 Key 是隐形炸弹:即使你已经不再使用某个组织的 API,只要环境变量中残留该 Key,它就会持续覆盖你的订阅认证非交互模式更敏感claude -p模式下,只要有环境变量,就会强制使用它,完全忽略/login。

博客 8857

UI渲染顺序:合批为何被拆碎?

在 Hierarchy 中,避免出现:Image(列表1) → Text(列表1) → 特效 → Image(列表2) → Text(列表2)…若可行,在逻辑上把布局组织成“同类元素集中”:例如:列表行中,Image 集中、Text 集中;或者接受 Text 本身就拆出一批,关键是不要在 Text 中间再插入别的材质。现实中不一定能做到完美的“所有 Image 连在一起”,但你会有一个意识:同一 Canvas 内,如果你把不同材质的元素交错穿插,

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 84

C#中的值类型

所有的值类型都隐含地声明了一个公共的无参数的构造函数,这个构造函数叫做默认构造函数。默认构造函数返回一个初始为零的值类型的实例,称之为默认值。 对于sbyte,byte,short,ushort,int,uint,long,ulong,默认值为0。 对于char,默认值是’\x0000’ ,对于float,默认值是0。0F 对于double,默认值是0。0D 对于decimal,默认值是0。0M 对于bool,默认值是false 对于一个枚举类型,默认值是0 对于一个结构类型,默认值的设置就是把所有值类型的

weixin_40948750的博客 2271

ICML-2025《Learning from Sample Stability for Deep Clustering》

用于指导深度聚类模型的训练,从而提升模型对困难样本的学习能力,最终改善整体聚类性能。首先,利用K-means在原始样本(非增强)的表征上进行聚类,得到初始聚类分配。其目的是鼓励模型对同一稳定样本在连续epoch中产生相近的表征。输出差异大)会产生更大的损失值,从而引导模型优先优化这些困难样本。此损失借鉴了NT-Xent损失的思想,但将正样本对定义为。最后,通过对比学习优化聚类中心,将同一聚类在。为了获得更具代表性的聚类中心,论文提出。为了学习更鲁棒的表征,模型在在线网络。首先,论文定义了样本。

Christo的博客 827

C#值类型和引用类型

1.值类型的数据在栈中,引用类型数据在堆中。 2.值类型直接存储数据的值,而引用类型存储数据的引用。 3.值类型的基类:System.ValueType,System.ValueType又继承自System.Object。引用类型的基类:System.Object。 4.值类型有:结构体struct,数值类型(short,ushort,int,uint,long,ulong,byte等),b...

weixin_34390996的博客 77

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

值类型和引用类型

C#的数据类型有三大类: 1、数值类型 2、引用类型 3、指针类型(仅用于非安全代码) 数值类型--直接派生于System.ValueType 1.结构类型(struct) 1.简单类型 1.整值型 整型(byte--System.Byte,sbyte--System.SByte, long--System.Int64,ulong--System.Int64, sh...

Langzi_2014的专栏 197

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

判断一个OBject类型是值类型还是引用类型

“根据定义,所有的值类型都必须从System.ValueType派生,所有的枚举都从System.Enum抽象类型中派生,后者又从System.ValueType派生的” -------摘自《CLR VIA C#》; 可以通过查找MSDN 测试代码: class Program { static voi...

weixin_33932129的博客 239

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C#类和接口、虚方法和抽象方法及值类型和引用类型的区别

1.C#类和接口的区别接口是负责功能的定义,项目中通过接口来规范类,操作类以及抽象类的概念!而类是负责功能的具体实现!在类中也有抽象类的定义,抽象类与接口的区别在于:抽象类是一个不完全的类,类里面有抽象的方法,属性,也可以有具体的方法和属性,需要进一步的专业化。但接口是一个行为的规范,里面的所有东西都是抽象的!一个类只可以继承一个基类也就是父类,但可以实现多

524

学习C#类和接口、虚方法和抽象方法及值类型和引用类型的区别?

1.C#类和接口的区别接口是负责功能的定义,项目中通过接口来规范类,操作类以及抽象类的概念!而类是负责功能的具体实现!在类中也有抽象类的定义,抽象类与接口的区别在于:抽象类是一个不完全的类,类里面有抽象的方法,属性,也可以有具体的方法和属性,需要进一步的专业化。但接口是一个行为的规范,里面的所有东西都是抽象的!一个类只可以继承一个基类也就是父类,但可以实现多个接口PS:接口除了规范一个行为之外

梦醒无痕 342

C#基础知识简单梳理

本文是转发博友的总结,方便自己以后随时温习: 1.值类型和引用类型   1.1堆和栈   简单的说值类型存放在堆栈上面,引用类型的数据存放在托管堆上面(它的引用地址却存放在堆栈上面)!   栈:它是一个内存数组,是一个先进后出的数据结构!   栈的特征:数据只能从栈顶进,从栈顶出!   堆:它是一个内存区域,可以分配大块区域存储某类型的数据...

abn1122的博客 145

C#初始化数组的内存分配

初始化数组时,C#会分配内存以存储数组对象和数组元素。 对于值类型的数组,内存分配会包括所有元素的实际存储空间。 对于引用类型的数组,初始化数组时只会分配存储引用的空间,实际对象的内存会在你实例化它们时分配。

m0_73117967的博客 771

C#中值类型和引用类型

概念: 1.值类型:数据存储在内存的堆栈中,从堆栈中可以快速地访问这些数据,因此,值类型表示实际的数据。 2.引用类型:表示指向存储在内存堆中的数据的指针或引用(包括类、接口、数组和字符串)。 C#中定义的值类型包括原类型(Sbyte、Byte、Short、Ushort、Int、Uint、Long、Ulong、Char、Float、Double、Bool、Decimal)、枚...

weixin_30906701的博客 61

C#的基础知识内容

开发工具与关键技术:VSMVC 作者:小益 撰写时间:2022/3/17 这是我自己总结的一些C#的基础知识内容,总共总结了以下六点,控制器的输入与输出、类的实例化、值类型的装箱和拆箱、String和string之间的区别、值类型的几个特点、还有值类型和引用类型之间的区别。 一、输入与输出: Console.Write(); 输出后不换行 Console.WriteLine(); 输出后自动换行 Console.ReadLine(); 读取键盘时输入的所有字符,返回字符串。按下回车键退出 ..

m0_57735713的博客 705
上一篇: Web 认证机制演进:从 Session、token 到 Jwt + 缓存的工程实践
下一篇: # 深入解析 C# 中类(class)与结构(struct)的异同
bugcome_com
博客等级 码龄3年 32粉丝 131原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bugcome_com

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值