当前位置: 首页 > news >正文

C#基础(6)值类型和引用类型

前言

我们先前已经完成了数组相关的学习,今天我们就要来详细介绍一下数据类型了。

引用类型是指变量存储的是对象的引用或地址,而不是实际的数据。在引用类型中,变量存储的是指向对象的指针,通过这个指针可以访问对象的实际数据。当一个引用类型的变量赋值给另一个变量时,实际复制的是引用,而不是对象本身。这意味着修改一个变量的值会影响其他变量,因为它们引用的是同一个对象。常见的引用类型有数组、字符串、对象等。

需要注意的是,不同编程语言对值类型和引用类型的实现方式可能有所不同。在一些语言中,值类型和引用类型可能有不同的语法和特性。但无论怎样,理解和区分值类型和引用类型对于正确理解和使用编程语言非常重要。

C#相关的面试中,也会有提及这两个概念的划分。

分下类

引用类型:string,数组,类(还没学到)

值类型:除了以上三个都是(包括结构体【没学】)

区别

例子1: 引用类型 - 数组

// 创建一个引用类型数组
string[] names = new string[3];// 修改数组中的元素
names[0] = "Alice";
names[1] = "Bob";
names[2] = "Charlie";// 将数组赋值给另一个引用
string[] otherNames = names;// 修改另一个数组中的元素
otherNames[0] = "Dave";// 打印原始数组中的第一个元素
Console.WriteLine(names[0]);  // 输出: "Dave"

在这个例子中,namesotherNames都是引用类型数组,它们引用了相同的内存地址,指向同一个数组。因此,当修改otherNames中的元素时,实际上也会修改names中的元素。

例子2: 值类型

// 创建一个值类型变量
int x = 5;// 将变量赋值给另一个变量
int y = x;// 修改另一个变量的值
y = 10;// 打印原始变量的值
Console.WriteLine(x);  // 输出: 5

在这个例子中,x是一个值类型变量,它在内存中有自己的存储空间。当将x赋值给y时,实际上是将x的值复制给y。因此,当修改y的值时,不会影响x的值。

可以看到,引用类型的值更改的话是会影响引用值的

值类型:在相互赋值时,把内容拷贝给对方,它变我也不变

引用类型:在相互赋值时,是让两者指向同一个值,它变我也变

为什么会有上述区别

你肯定有疑问,为什么会是这样的呢?

其实是因为二者内存区域是不同的,所以存储方式也是不同的

值类型存储在栈空间,这是系统分配的地方,会自动回收,有小而快的特点。

引用类型存储在堆空间,需要我们操作者手动申请和手动释放,他很大,但是运行起来不快。

可能这样说你还是觉得很抽象。

那我们来画个图吧。

例子存储的展示

这里可以看到,值类型是直接指向的数据,而引用类型是指向地址后再指向数据,我们也就能明白为什么,我们修改引用类型的值会波及到本身了,是因为虽然他们的地址没变,但是他们指向位置的元素一起变了。

总结

我想通过这张图,你应该已经明白引用类型和值类型的区别了。

内容比较简单。

还是那句话,戒骄戒躁,学习要脚踏实地。

请期待我下一篇博客。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【鸿蒙 HarmonyOS NEXT】使用EventHub进行数据通信
  • java 防重复提交
  • P2343 宝石管理系统
  • SpringBoot开发——整合MyBatis
  • 人工智能在C/C++中的应用
  • VitePress 自定义主题:打造专属文档网站
  • 数学建模笔记—— 整数规划和0-1规划
  • 避障小车—51单片机
  • 大数据技术体系架构
  • 为何家用无线路由器不能实现PROFINET通信?
  • EasyExcel 文件导出:表头与内容样式简单设置
  • 【Tools】什么是基座模型
  • 机械学习—零基础学习日志(Python做数据分析02)
  • ✨机器学习笔记(三)—— 多元线性回归、特征缩放、Scikit-Learn(未完待续)
  • 大腾智能出席龙华云创中心启动与鸿蒙园揭牌仪式
  • 【391天】每日项目总结系列128(2018.03.03)
  • 【面试系列】之二:关于js原型
  • 2017年终总结、随想
  • HashMap剖析之内部结构
  • HTML5新特性总结
  • iOS 颜色设置看我就够了
  • JDK 6和JDK 7中的substring()方法
  • Otto开发初探——微服务依赖管理新利器
  • php的插入排序,通过双层for循环
  • php面试题 汇集2
  • REST架构的思考
  • Spring Boot MyBatis配置多种数据库
  • webgl (原生)基础入门指南【一】
  • 大型网站性能监测、分析与优化常见问题QA
  • 给第三方使用接口的 URL 签名实现
  • 主流的CSS水平和垂直居中技术大全
  • UI设计初学者应该如何入门?
  • 选择阿里云数据库HBase版十大理由
  • ​​​【收录 Hello 算法】10.4 哈希优化策略
  • ​Java并发新构件之Exchanger
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • #pragma multi_compile #pragma shader_feature
  • #QT(一种朴素的计算器实现方法)
  • #stm32整理(一)flash读写
  • $.each()与$(selector).each()
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (每日一问)设计模式:设计模式的原则与分类——如何提升代码质量?
  • (算法)Travel Information Center
  • (一)基于IDEA的JAVA基础1
  • (转) Android中ViewStub组件使用
  • (转)可以带来幸福的一本书
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • .ai域名是什么后缀?
  • .libPaths()设置包加载目录
  • .NET Standard 的管理策略
  • .Net 垃圾回收机制原理(二)
  • .Net的DataSet直接与SQL2005交互
  • .NET开发人员必知的八个网站