代码解析 C# 引用类型还是值类型

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

最近笔者面试一些人,发现很多工作10年的人一些基础问题都答不好

记得当年自己大学刚学编程时,侯捷老师的《深入浅出MFC》开篇第一句勿在浮沙筑高台。项目如同建筑,下一层必须比上一层坚固,否则会垮塌。

如果我问你class类型和struct类型是引用类型还是值类型,你会要思考一下么,当然如果你是大佬请绕道

我们来复习一下C#中引用类型和值类型的一些基础概念:、

在 C# 中,值类型和引用类型是两种不同的类型。它们有以下几个主要区别:

  1. a .存储方式:值类型的实例直接存储在栈上,而引用类型的实例存储在堆上,栈上只存储引用(指向堆中实例的指针)。
  2. b. 传递方式:值类型的实例在传递时是通过值拷贝传递的,而引用类型的实例在传递时是通过引用拷贝传递的。
  3. c. 生命周期:值类型的实例的生命周期与其所在的作用域相同,而引用类型的实例的生命周期可能会超过其所在的作用域,因为引用可能会被传递到其他作用域中。
  4. d. 默认值:值类型的默认值是其零值(例如,整数类型的默认值为0),而引用类型的默认值是 null
  5. e.比较方式:值类型的比较是按值比较的,而引用类型的比较是按引用比较的(即比较两个引用是否指向同一个对象)。

   需要注意的是,C# 中的一些类型(如字符串)虽然是引用类型,但是它们的行为更像值类型,因为它们的实例在不可变时可以被重用,而不需要在堆上创建新的实例。此外,结构体(struct)也是值类型,但是可以像类一样拥有方法和属性。

using System;
class Program {
    static void Main(string[] args) {
        Type[] types = new Type[] {
            typeof(int),
            typeof(string),
            typeof(object),
            typeof(decimal),
            typeof(Program)
        };
        foreach (Type type in types) {
            Console.WriteLine($"{type.Name} is{(type.IsValueType ? " not" : "")} a reference type");
        }
    }
}

好的,看完上面,你应该有所新的收获,现在在问你一个问题,一个类里面的一个int型数据是值类型还是引用类型呢?

我们既然说到了引用类型和值类型,根据这个肯定要提到装箱和拆箱

在 Unity 中,装箱和拆箱与在标准的 C# 中是相同的。装箱是指将值类型(例如结构体)转换为引用类型(例如对象),而拆箱是指将引用类型转换回值类型。

下面是一些关于装箱和拆箱在 Unity 中的简单说明:

  • 装箱:装箱是将值类型转换为对象类型的过程。当你将一个值类型(例如 intfloat 或自定义结构体)赋值给一个对象类型(例如 objectSystem.Collections.ArrayList)时,就会发生装箱。装箱操作会在堆上创建一个新的对象,并将值类型的实例复制到新的对象中。这可能会导致性能问题,因为它需要进行额外的内存分配和复制操作。
  • 拆箱:拆箱是将对象类型转换回值类型的过程。当你从一个对象类型(例如 objectSystem.Collections.ArrayList)中提取一个值类型时,就会发生拆箱。拆箱操作将从对象中提取值类型实例,并将其复制到一个新的值类型变量中。这也可能会导致性能问题,因为它需要进行额外的内存分配和复制操作。

因此,在 Unity 中,尽量避免进行频繁的装箱和拆箱操作,特别是在性能敏感的代码路径中,因为它们可能会对游戏性能产生负面影响。如果可能的话,可以使用泛型类型(例如 List<T>Dictionary<TKey, TValue> 等)来避免装箱和拆箱操作,因为它们可以处理任意类型的值类型,而不需要进行装箱和拆箱操作。

相关文章
|
2月前
|
缓存 C# Windows
C#程序如何编译成Native代码
【10月更文挑战第15天】在C#中,可以通过.NET Native和第三方工具(如Ngen.exe)将程序编译成Native代码,以提升性能和启动速度。.NET Native适用于UWP应用,而Ngen.exe则通过预编译托管程序集为本地机器代码来加速启动。不过,这些方法也可能增加编译时间和部署复杂度。
116 2
|
3月前
|
C# Windows
visual studio 2022 社区版 c# 环境搭建及安装使用【图文解析-小白版】
这篇文章提供了Visual Studio 2022社区版C#环境的搭建和安装使用指南,包括下载、安装步骤和创建C#窗体应用程序的详细图文解析。
visual studio 2022 社区版 c# 环境搭建及安装使用【图文解析-小白版】
|
21天前
|
编译器 C# 开发者
C# 9.0 新特性解析
C# 9.0 是微软在2020年11月随.NET 5.0发布的重大更新,带来了一系列新特性和改进,如记录类型、初始化器增强、顶级语句、模式匹配增强、目标类型的新表达式、属性模式和空值处理操作符等,旨在提升开发效率和代码可读性。本文将详细介绍这些新特性,并提供代码示例和常见问题解答。
34 7
C# 9.0 新特性解析
|
20天前
|
C# 开发者
C# 10.0 新特性解析
C# 10.0 在性能、可读性和开发效率方面进行了多项增强。本文介绍了文件范围的命名空间、记录结构体、只读结构体、局部函数的递归优化、改进的模式匹配和 lambda 表达式等新特性,并通过代码示例帮助理解这些特性。
30 2
|
1月前
|
存储 安全 Java
系统安全架构的深度解析与实践:Java代码实现
【11月更文挑战第1天】系统安全架构是保护信息系统免受各种威胁和攻击的关键。作为系统架构师,设计一套完善的系统安全架构不仅需要对各种安全威胁有深入理解,还需要熟练掌握各种安全技术和工具。
91 10
|
1月前
|
前端开发 JavaScript 开发者
揭秘前端高手的秘密武器:深度解析递归组件与动态组件的奥妙,让你代码效率翻倍!
【10月更文挑战第23天】在Web开发中,组件化已成为主流。本文深入探讨了递归组件与动态组件的概念、应用及实现方式。递归组件通过在组件内部调用自身,适用于处理层级结构数据,如菜单和树形控件。动态组件则根据数据变化动态切换组件显示,适用于不同业务逻辑下的组件展示。通过示例,展示了这两种组件的实现方法及其在实际开发中的应用价值。
34 1
|
2月前
|
机器学习/深度学习 人工智能 算法
揭开深度学习与传统机器学习的神秘面纱:从理论差异到实战代码详解两者间的选择与应用策略全面解析
【10月更文挑战第10天】本文探讨了深度学习与传统机器学习的区别,通过图像识别和语音处理等领域的应用案例,展示了深度学习在自动特征学习和处理大规模数据方面的优势。文中还提供了一个Python代码示例,使用TensorFlow构建多层感知器(MLP)并与Scikit-learn中的逻辑回归模型进行对比,进一步说明了两者的不同特点。
74 2
|
2月前
|
存储 搜索推荐 数据库
运用LangChain赋能企业规章制度制定:深入解析Retrieval-Augmented Generation(RAG)技术如何革新内部管理文件起草流程,实现高效合规与个性化定制的完美结合——实战指南与代码示例全面呈现
【10月更文挑战第3天】构建公司规章制度时,需融合业务实际与管理理论,制定合规且促发展的规则体系。尤其在数字化转型背景下,利用LangChain框架中的RAG技术,可提升规章制定效率与质量。通过Chroma向量数据库存储规章制度文本,并使用OpenAI Embeddings处理文本向量化,将现有文档转换后插入数据库。基于此,构建RAG生成器,根据输入问题检索信息并生成规章制度草案,加快更新速度并确保内容准确,灵活应对法律与业务变化,提高管理效率。此方法结合了先进的人工智能技术,展现了未来规章制度制定的新方向。
36 3
|
2月前
|
C#
C# 图形验证码实现登录校验代码
C# 图形验证码实现登录校验代码
84 2
|
2月前
|
SQL 监控 关系型数据库
SQL错误代码1303解析与处理方法
在SQL编程和数据库管理中,遇到错误代码是常有的事,其中错误代码1303在不同数据库系统中可能代表不同的含义