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

简介: 代码解析 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月前
|
机器学习/深度学习 算法 定位技术
Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现裂缝的检测识别(C#代码UI界面版)
本项目基于YOLOv8模型与C#界面,结合Baumer工业相机,实现裂缝的高效检测识别。支持图像、视频及摄像头输入,具备高精度与实时性,适用于桥梁、路面、隧道等多种工业场景。
295 27
|
4月前
|
存储 算法 安全
如何控制上网行为——基于 C# 实现布隆过滤器算法的上网行为管控策略研究与实践解析
在数字化办公生态系统中,企业对员工网络行为的精细化管理已成为保障网络安全、提升组织效能的核心命题。如何在有效防范恶意网站访问、数据泄露风险的同时,避免过度管控对正常业务运作的负面影响,构成了企业网络安全领域的重要研究方向。在此背景下,数据结构与算法作为底层技术支撑,其重要性愈发凸显。本文将以布隆过滤器算法为研究对象,基于 C# 编程语言开展理论分析与工程实践,系统探讨该算法在企业上网行为管理中的应用范式。
139 8
|
4月前
|
存储 监控 算法
解析公司屏幕监控软件中 C# 字典算法的数据管理效能与优化策略
数字化办公的时代背景下,企业为维护信息安全并提升管理效能,公司屏幕监控软件的应用日益普及。此软件犹如企业网络的 “数字卫士”,持续记录员工电脑屏幕的操作动态。然而,伴随数据量的持续增长,如何高效管理这些监控数据成为关键议题。C# 中的字典(Dictionary)数据结构,以其独特的键值对存储模式和高效的操作性能,为公司屏幕监控软件的数据管理提供了有力支持。下文将深入探究其原理与应用。
98 4
|
5月前
|
机器学习/深度学习 监控 算法
员工上网行为监控软件中基于滑动窗口的C#流量统计算法解析​
在数字化办公环境中,员工上网行为监控软件需要高效处理海量网络请求数据,同时实时识别异常行为(如高频访问非工作网站)。传统的时间序列统计方法因计算复杂度过高,难以满足低延迟需求。本文将介绍一种基于滑动窗口的C#统计算法,通过动态时间窗口管理,实现高效的行为模式分析与流量计数。
137 2
|
6月前
|
算法 PyTorch 算法框架/工具
昇腾 msmodelslim w8a8量化代码解析
msmodelslim w8a8量化算法原理和代码解析
456 5
|
8月前
|
搜索推荐 UED Python
实现一个带有昼夜背景切换的动态时钟:从代码到功能解析
本文介绍了一个使用Python和Tkinter库实现的动态时钟程序,具有昼夜背景切换、指针颜色随机变化及整点和半点报时功能。通过设置不同的背景颜色和随机变换指针颜色,增强视觉吸引力;利用多线程技术确保音频播放不影响主程序运行。该程序结合了Tkinter、Pygame、Pytz等库,提供了一个美观且实用的时间显示工具。欢迎点赞、关注、转发、收藏!
379 94
|
6月前
|
监控 算法 安全
基于 C# 的内网行为管理软件入侵检测算法解析
当下数字化办公环境中,内网行为管理软件已成为企业维护网络安全、提高办公效率的关键工具。它宛如一位恪尽职守的网络守护者,持续监控内网中的各类活动,以确保数据安全及网络稳定。在其诸多功能实现的背后,先进的数据结构与算法发挥着至关重要的作用。本文将深入探究一种应用于内网行为管理软件的 C# 算法 —— 基于二叉搜索树的入侵检测算法,并借助具体代码例程予以解析。
108 4
|
6月前
|
存储 JavaScript 前端开发
全网最全情景,深入浅出解析JavaScript数组去重:数值与引用类型的全面攻略
如果是基础类型数组,优先选择 Set。 对于引用类型数组,根据需求选择 Map 或 JSON.stringify()。 其余情况根据实际需求进行混合调用,就能更好的实现数组去重。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
6月前
|
传感器 监控 Java
Java代码结构解析:类、方法、主函数(1分钟解剖室)
### Java代码结构简介 掌握Java代码结构如同拥有程序世界的建筑蓝图,类、方法和主函数构成“黄金三角”。类是独立的容器,承载成员变量和方法;方法实现特定功能,参数控制输入环境;主函数是程序入口。常见错误包括类名与文件名不匹配、忘记static修饰符和花括号未闭合。通过实战案例学习电商系统、游戏角色控制和物联网设备监控,理解类的作用、方法类型和主函数任务,避免典型错误,逐步提升编程能力。 **脑图速记法**:类如太空站,方法即舱段;main是发射台,static不能换;文件名对仗,括号要成双;参数是坐标,void不返航。
249 5
|
7月前
|
人工智能 文字识别 自然语言处理
保单AI识别技术及代码示例解析
车险保单包含基础信息、车辆信息、人员信息、保险条款及特别约定等关键内容。AI识别技术通过OCR、文档结构化解析和数据校验,实现对保单信息的精准提取。然而,版式多样性、信息复杂性、图像质量和法律术语解析是主要挑战。Python代码示例展示了如何使用PaddleOCR进行保单信息抽取,并提出了定制化训练、版式分析等优化方向。典型应用场景包括智能录入、快速核保、理赔自动化等。未来将向多模态融合、自适应学习和跨区域兼容性发展。

推荐镜像

更多
  • DNS