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

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 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 应用程序至关重要。值类型提供了轻量级的数据结构,而引用类型则提供了更丰富的特性,如继承和接口实现。开发者应根据实际需要选择适当的类型。

目录
打赏
0
2
2
0
139
分享
相关文章
|
4月前
|
Java内存模型深度解析:从理论到实践####
【10月更文挑战第21天】 本文深入探讨了Java内存模型(JMM)的核心概念与底层机制,通过剖析其设计原理、内存可见性问题及其解决方案,结合具体代码示例,帮助读者构建对JMM的全面理解。不同于传统的摘要概述,我们将直接以故事化手法引入,让读者在轻松的情境中领略JMM的精髓。 ####
75 6
基于 C# 的内网行为管理软件入侵检测算法解析
当下数字化办公环境中,内网行为管理软件已成为企业维护网络安全、提高办公效率的关键工具。它宛如一位恪尽职守的网络守护者,持续监控内网中的各类活动,以确保数据安全及网络稳定。在其诸多功能实现的背后,先进的数据结构与算法发挥着至关重要的作用。本文将深入探究一种应用于内网行为管理软件的 C# 算法 —— 基于二叉搜索树的入侵检测算法,并借助具体代码例程予以解析。
23 4
Java内存模型(JMM)深度解析####
本文深入探讨了Java内存模型(JMM)的工作原理,旨在帮助开发者理解多线程环境下并发编程的挑战与解决方案。通过剖析JVM如何管理线程间的数据可见性、原子性和有序性问题,本文将揭示synchronized关键字背后的机制,并介绍volatile关键字和final关键字在保证变量同步与不可变性方面的作用。同时,文章还将讨论现代Java并发工具类如java.util.concurrent包中的核心组件,以及它们如何简化高效并发程序的设计。无论你是初学者还是有经验的开发者,本文都将为你提供宝贵的见解,助你在Java并发编程领域更进一步。 ####
全网最全情景,深入浅出解析JavaScript数组去重:数值与引用类型的全面攻略
如果是基础类型数组,优先选择 Set。 对于引用类型数组,根据需求选择 Map 或 JSON.stringify()。 其余情况根据实际需求进行混合调用,就能更好的实现数组去重。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
企业内网监控系统中基于哈希表的 C# 算法解析
在企业内网监控系统中,哈希表作为一种高效的数据结构,能够快速处理大量网络连接和用户操作记录,确保网络安全与效率。通过C#代码示例展示了如何使用哈希表存储和管理用户的登录时间、访问IP及操作行为等信息,实现快速的查找、插入和删除操作。哈希表的应用显著提升了系统的实时性和准确性,尽管存在哈希冲突等问题,但通过合理设计哈希函数和冲突解决策略,可以确保系统稳定运行,为企业提供有力的安全保障。
C# 9.0 新特性解析
C# 9.0 是微软在2020年11月随.NET 5.0发布的重大更新,带来了一系列新特性和改进,如记录类型、初始化器增强、顶级语句、模式匹配增强、目标类型的新表达式、属性模式和空值处理操作符等,旨在提升开发效率和代码可读性。本文将详细介绍这些新特性,并提供代码示例和常见问题解答。
96 7
C# 9.0 新特性解析
Java内存管理深度解析####
本文深入探讨了Java虚拟机(JVM)中的内存分配与垃圾回收机制,揭示了其高效管理内存的奥秘。文章首先概述了JVM内存模型,随后详细阐述了堆、栈、方法区等关键区域的作用及管理策略。在垃圾回收部分,重点介绍了标记-清除、复制算法、标记-整理等多种回收算法的工作原理及其适用场景,并通过实际案例分析了不同GC策略对应用性能的影响。对于开发者而言,理解这些原理有助于编写出更加高效、稳定的Java应用程序。 ####
|
4月前
|
C# 10.0 新特性解析
C# 10.0 在性能、可读性和开发效率方面进行了多项增强。本文介绍了文件范围的命名空间、记录结构体、只读结构体、局部函数的递归优化、改进的模式匹配和 lambda 表达式等新特性,并通过代码示例帮助理解这些特性。
80 2
Java中的内存管理与垃圾回收机制解析
本文深入探讨了Java编程语言中的内存管理方式,特别是垃圾回收机制。我们将了解Java的自动内存管理是如何工作的,它如何帮助开发者避免常见的内存泄漏问题。通过分析不同垃圾回收算法(如标记-清除、复制和标记-整理)以及JVM如何选择合适的垃圾回收策略,本文旨在帮助Java开发者更好地理解和优化应用程序的性能。
|
5月前
|
JVM锁的膨胀过程与锁内存变化解析
在Java虚拟机(JVM)中,锁机制是确保多线程环境下数据一致性和线程安全的重要手段。随着线程对共享资源的竞争程度不同,JVM中的锁会经历从低级到高级的膨胀过程,以适应不同的并发场景。本文将深入探讨JVM锁的膨胀过程,以及锁在内存中的变化。
85 1

推荐镜像

更多