C# 中的值类型与引用类型:内存大小解析

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: C# 中的值类型与引用类型:内存大小解析

在 C# 中,类型可以被归类为值类型或引用类型,它们在内存中的存储和管理方式不同。了解这些差异对于优化程序性能和资源管理至关重要。

值类型 (Value Types)

值类型包括所有内置的数值类型(如 int, double 等)、char 类型、bool 类型,以及用户自定义的 struct 类型和 enum 类型。

内存占用

值类型实例占用的内存大小仅由其字段决定。例如,定义一个 Point 结构体:

public struct Point
{
    public int X;
    public int Y;
}

Point 结构体需要占用 8 字节的内存(假设 int4 字节),这正好是存储其两个 int 字段所需的内存。

实例化与赋值

值类型实例的赋值总是会进行实例复制。这意味着当你将一个值类型实例赋给另一个变量时,会创建该实例的一个全新副本。

Point p1 = new Point();
p1.X = 7;
Point p2 = p1;

p1.X = 9;
Console.WriteLine(p1.X); // 输出 9
Console.WriteLine(p2.X); // 输出 7(原始值)

引用类型 (Reference Types)

引用类型包括类、数组、委托和接口类型(包括预定义的 string 类型)。

内存占用

引用类型需要为引用和对象单独分配存储空间。对象除了占用和字段一样多的字节数外,还需要额外的管理空间开销。这个开销至少需要 8 个字节来存储对象的类型信息和一些临时状态信息(如线程锁状态、垃圾回收固定等)。此外,根据.NET运行时是工作在32位还是64位平台上,每一个对象的引用都需要额外的 48 个字节的存储空间。

public class PointC
{
    public int X, Y;
}

对于 PointC 类,除了存储两个 int 字段所需的 8 字节外,还需要额外的空间来存储对象的引用和管理信息。

实例化与赋值

引用类型变量赋值只会复制引用,而不会复制对象实例。这意味着,当你将一个引用类型实例赋给另一个变量时,两个变量都指向同一个对象实例。

PointC pc1 = new PointC();
pc1.X = 7;
PointC pc2 = pc1;

pc1.X = 9;
Console.WriteLine(pc1.X); // 输出 9
Console.WriteLine(pc2.X); // 输出 9(与 pc1 相同实例)

空引用 (Null Reference)

引用类型可以使用 null 来赋值,表示它并不指向任何对象。尝试访问 null 引用的成员会引发 NullReferenceException 异常。

PointC pc3 = null;
Console.WriteLine(pc3 == null); // 输出 true
// Console.WriteLine(pc3.X); // 未经处理的异常: System.NullReferenceException

总结

值类型和引用类型在 C# 中有着根本的不同,了解它们如何占用内存以及它们的行为对于编写高效且稳定的 .NET 应用程序至关重要。值类型提供了轻量级的数据结构,而引用类型则提供了更丰富的特性,如继承和接口实现。开发者应根据实际需要选择适当的类型。

相关文章
|
2月前
|
C# Windows
visual studio 2022 社区版 c# 环境搭建及安装使用【图文解析-小白版】
这篇文章提供了Visual Studio 2022社区版C#环境的搭建和安装使用指南,包括下载、安装步骤和创建C#窗体应用程序的详细图文解析。
visual studio 2022 社区版 c# 环境搭建及安装使用【图文解析-小白版】
|
3月前
|
存储 开发框架 .NET
"揭秘.NET内存奥秘:从CIL深处窥探值类型与引用类型的生死较量,一场关于速度与空间的激情大戏!"
【8月更文挑战第16天】在.NET框架中,通过CIL(公共中间语言)可以深入了解值类型与引用类型的内存分配机制。值类型如`int`和`double`直接在方法调用堆栈上分配,访问迅速,生命周期随栈帧销毁而结束。引用类型如`string`在托管堆上分配,堆栈上仅存储引用,CLR负责垃圾回收,确保高效且自动化的内存管理。
56 6
|
12天前
|
编译器 C# 开发者
C# 9.0 新特性解析
C# 9.0 是微软在2020年11月随.NET 5.0发布的重大更新,带来了一系列新特性和改进,如记录类型、初始化器增强、顶级语句、模式匹配增强、目标类型的新表达式、属性模式和空值处理操作符等,旨在提升开发效率和代码可读性。本文将详细介绍这些新特性,并提供代码示例和常见问题解答。
28 7
C# 9.0 新特性解析
|
4月前
|
缓存 算法 Java
Java面试题:深入探究Java内存模型与垃圾回收机制,Java中的引用类型在内存管理和垃圾回收中的作用,Java中的finalize方法及其在垃圾回收中的作用,哪种策略能够提高垃圾回收的效率
Java面试题:深入探究Java内存模型与垃圾回收机制,Java中的引用类型在内存管理和垃圾回收中的作用,Java中的finalize方法及其在垃圾回收中的作用,哪种策略能够提高垃圾回收的效率
41 1
|
11天前
|
C# 开发者
C# 10.0 新特性解析
C# 10.0 在性能、可读性和开发效率方面进行了多项增强。本文介绍了文件范围的命名空间、记录结构体、只读结构体、局部函数的递归优化、改进的模式匹配和 lambda 表达式等新特性,并通过代码示例帮助理解这些特性。
24 2
|
1月前
|
Java 测试技术 Android开发
让星星⭐月亮告诉你,强软弱虚引用类型对象在内存足够和内存不足的情况下,面对System.gc()时,被回收情况如何?
本文介绍了Java中四种引用类型(强引用、软引用、弱引用、虚引用)的特点及行为,并通过示例代码展示了在内存充足和不足情况下这些引用类型的不同表现。文中提供了详细的测试方法和步骤,帮助理解不同引用类型在垃圾回收机制中的作用。测试环境为Eclipse + JDK1.8,需配置JVM运行参数以限制内存使用。
32 2
|
1月前
|
C# 开发工具 Windows
C# 获取Windows系统信息以及CPU、内存和磁盘使用情况
C# 获取Windows系统信息以及CPU、内存和磁盘使用情况
44 0
|
2月前
|
存储 Java C#
C# 中的值类型与引用类型
在 C# 编程中,值类型和引用类型的区别至关重要,直接影响内存管理、性能优化及编程模式选择。值类型直接存储数据(如 `int`、`float`),而引用类型存储数据的引用地址(如 `class`、`string`)。值类型的赋值涉及数据复制,适合小数据量;引用类型仅复制引用,适合大数据量处理但需关注垃圾回收。本文通过具体代码示例详细解析二者的定义、存储方式及性能影响,并提供实战案例分析及易错点避免方法,帮助读者更好地理解和应用。
61 2
|
3月前
|
前端开发 开发者 C#
深度解析 Uno Platform 中的 MVVM 模式:从理论到实践的全方位指南,助你轻松掌握通过 C# 与 XAML 构建高效可维护的跨平台应用秘籍
【8月更文挑战第31天】本文详细介绍如何在优秀的跨平台 UI 框架 Uno Platform 中实施 MVVM(Model-View-ViewModel)模式,通过一个简单的待办事项列表应用演示其实现过程。MVVM 模式有助于分离视图层与业务逻辑层,提升代码组织性、易测性和可维护性。Uno Platform 的数据绑定机制使视图与模型间的同步变得高效简便。文章通过构造 `TodoListViewModel` 类及其相关视图,展示了如何解耦视图与模型,实现动态数据绑定及命令处理,从而提高代码质量和开发效率。通过这一模式,开发者能更轻松地构建复杂的跨平台应用。
54 0

推荐镜像

更多