C# 值类型和引用类型详解

简介

C# 中,值类型和引用类型是两个基础的数据类型类别,它们的主要区别在于 存储位置 和 赋值方式。

值类型

值类型存储的是数据本身,分配在 栈 (Stack) 中。当一个值类型变量被赋值给另一个变量时,会复制值。

值类型的特点

  • 内存分配:存储在栈上。

  • 存储内容:直接保存数据。

  • 复制行为:赋值时复制数据,两个变量互不影响。

  • 默认值:初始化为类型的默认值(如 int 为 0)。

  • 不可为 null(除非是可空类型,如 int?)。

值类型的常见示例

  • 基本数据类型:int、double、bool、char、float、decimal

  • 结构体(struct):例如 DateTime、Point

  • 枚举(enum

值类型示例

int a = 10;  // 值类型变量
int b = a;   // 将 a 的值赋值给 b
b = 20;      // 修改 b 的值,不影响 aConsole.WriteLine(a);  // 输出 10
Console.WriteLine(b);  // 输出 20

引用类型

引用类型存储的是数据的地址(引用),实际数据存储在 堆 (Heap) 中。当一个引用类型变量被赋值给另一个变量时,会复制引用,即两个变量指向同一个对象。

引用类型的特点

  • 内存分配:引用存储在栈上,数据存储在堆上。

  • 存储内容:保存对数据的引用地址,而不是数据本身。

  • 复制行为:赋值时复制引用,多个变量指向同一块内存。

  • 默认值:初始化为 null

  • 可以为 null

引用类型的常见示例

  • 类(class

  • 接口(interface

  • 委托(delegate

  • 字符串(string

  • 数组(array

引用类型示例

class MyClass
{public int Value;
}MyClass obj1 = new MyClass();
obj1.Value = 10;MyClass obj2 = obj1;  // 将 obj1 的引用赋值给 obj2
obj2.Value = 20;      // 修改 obj2 的值,会影响 obj1Console.WriteLine(obj1.Value);  // 输出 20
Console.WriteLine(obj2.Value);  // 输出 20

值类型与引用类型的区别

特性值类型引用类型
存储位置栈存储引用,堆存储数据
存储内容保存数据本身保存数据的地址(引用)
赋值行为复制值复制引用,多个引用指向同一个对象
默认值默认值(如 int 为 0)默认值为 null
性能栈上分配,效率高堆上分配,需垃圾回收

可空类型(Nullable

值类型通常不能为 null,但可以通过 Nullable<T>T? 使其可为空。

示例:

int? a = null;
if (a.HasValue)Console.WriteLine(a.Value);
elseConsole.WriteLine("a is null");

特殊的引用类型:字符串

  • 字符串(string)是引用类型,但具有值类型的行为。

  • 因为字符串是 不可变的(Immutable),修改字符串实际上是创建了一个新对象。

string str1 = "Hello";
string str2 = str1;
str2 = "World";Console.WriteLine(str1);  // 输出 Hello
Console.WriteLine(str2);  // 输出 World
值类型与引用类型的转换
  • 装箱(Boxing):将值类型转换为引用类型。

  • 拆箱(Unboxing):将引用类型转换为值类型。

示例:

int a = 10;          // 值类型
object obj = a;      // 装箱,值类型变为引用类型
int b = (int)obj;    // 拆箱,将引用类型还原为值类型Console.WriteLine(a);  // 输出 10
Console.WriteLine(b);  // 输出 10

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/892295.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

福建双色荷花提取颜色

提取指定颜色 HSV双色荷花代码验证 参照《OpenCV图像处理技术》 HSV 要用HSV的色调、饱和度和亮度来提取指定颜色。 双色荷花 农林大学金山校区观音湖 代码 import cv2 import numpy as npimgcv2.imread("./sucai6/hua.jpg") cv2.imshow("SRC",img) h…

利用Python爬虫获取API接口:探索数据的力量

引言 在当今数字化时代&#xff0c;数据已成为企业、研究机构和个人获取信息、洞察趋势和做出决策的重要资源。Python爬虫作为一种高效的数据采集工具&#xff0c;能够帮助我们自动化地从互联网上获取大量的数据。而API接口作为数据获取的重要途径之一&#xff0c;为我们提供了…

基于C语言的卡丁车管理系统【控制台应用程序】

注意&#xff1a;需要提前创建对应的.dat文件 本项目实现了数据的永久存储&#xff0c;有用户的注册、登录。 管理员对卡丁车的管理、查看预约用户、修改帐户权限。 用户对个人信息的管理、查看并预约卡丁车、卡丁车维修上报。 维修员对卡丁车的维修状态上报、个人信息管理。 …

推荐系统评估指标综合指南

如何用 Hitrate、Precisionk 等指标优化你的推荐系统 引言 为了更好地理解和优化推荐系统的性能&#xff0c;本文将深入探讨五个关键的评估指标&#xff1a;Hitrate、Precisionk、Recallk、NDCG&#xff08;归一化折损累积增益&#xff09;以及MRR&#xff08;平均倒数排名&a…

tdengine数据库使用java连接

1 首先给你的项目添加依赖 <dependency> <groupId>com.taosdata.jdbc</groupId> <artifactId>taos-jdbcdriver</artifactId> <version>3.4.0</version> <!-- 表示依赖不会传递 --> </dependency> 注意&am…

pyqt鸟瞰

QApplication‌是Qt框架中的一个类&#xff0c;专门用于管理基于QWidget的图形用户界面&#xff08;GUI&#xff09;应用程序的控制流和主要设置。QApplication类继承自QGuiApplication&#xff0c;提供了许多与GUI相关的功能&#xff0c;如窗口系统集成、事件处理等。 QAppli…

MIUI显示/隐藏5G开关的方法,信号弱时开启手机Wifi通话方法

5G网速虽快&#xff0c;手机功耗也大。 1.取消MIUI强制的5G&#xff0c;手动设置4G的方法&#xff01; 【小米澎湃OS, Xiaomi HyperOS显示/隐藏5G开关的方法】 1.1.小米MIUI系统升级后&#xff0c;被强制连5G&#xff0c;手动设置开关被隐藏&#xff0c;如下图&#xff1a; 1…

pikachu - Cross-Site Scripting(XSS)

pikachu - Cross-Site Scripting&#xff08;XSS&#xff09; 声明&#xff01; 笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人无关&#xff0c;切勿触碰法律底线&#xff0c;否则后果自负&#x…

部署:上传项目代码 配置数据库

一、上传代码 1、使用git 可以使用Git Clone。使用前&#xff0c;在服务器上也要创建秘钥对。这里的密钥对&#xff0c;是专门用来读取Git仓库的。 在宝塔上&#xff0c;点击终端。进来后&#xff0c;运行 ssh-keygen还是一路回车&#xff0c;密钥对就建好了。 接着用命令…

HTML5 弹跳动画(Bounce Animation)详解

HTML5 弹跳动画&#xff08;Bounce Animation&#xff09;详解 弹跳动画是一种动态效果&#xff0c;使元素在出现或消失时看起来像是在跳动。这种效果可以通过 CSS 动画或 JavaScript 来实现&#xff0c;增强用户体验。 1. 使用 CSS 实现弹跳动画 可以使用 CSS 的 keyframes…

【Apache Paimon】-- 14 -- Spark 集成 Paimon 之 Filesystem Catalog 与 Hive Catalog 实践

目录 1. 背景介绍 2. 环境准备 2.1、技术栈说明 2.2、环境依赖 2.3、硬件与软件环境 2.4、主要工具清单 2.5、Maven 项目结构 2.6、maven pom.xml 依赖 3. Spark 与 Paimon Filesystem Catalog 集成 3.1、HDFS FileSystem catalog 3.1.1、代码内容 3.1.2、运行输出…

时敏软件定义网络的服务保证

论文标题&#xff1a; Service Guarantees for Time-Sensitive Software-Defined Networks作者信息&#xff1a; Weijiang Kong论文出处&#xff1a; Eindhoven University of Technology, 2025年1月20日 摘要&#xff1a; 在过去十年中&#xff0c;随着半导体技术的进步和对更…

SQL语言的数据库交互

SQL语言的数据库交互 在当今的信息时代&#xff0c;数据的管理和处理变得越来越重要&#xff0c;而结构化查询语言&#xff08;SQL&#xff09;作为一种用于管理关系型数据库的标准语言&#xff0c;其重要性愈加凸显。本文将深入探讨SQL语言的基本概念、主要功能、常见语法以及…

Java类加载机制

类加载机制 类加载机制类加载的过程加载&#xff08;Loading&#xff09;验证&#xff08;Verification&#xff09;准备&#xff08;Preparation&#xff09;解析&#xff08;Resolution&#xff09;初始化&#xff08;Initialization&#xff09; 类加载器启动类加载器扩展类…

【Linux】sed编辑器

一、基本介绍 sed编辑器也叫流编辑器&#xff08;stream editor&#xff09;&#xff0c;它是根据事先设计好得一组规则编辑数据流。 交互式文本编辑器&#xff08;如Vim&#xff09;中&#xff0c;可以用键盘命令交互式地插入、删除或替换文本数据。 sed编辑器是根据命令处理…

嵌入式入门Day40

C Day3 C对C的结构体的扩充类this指针类的大小类中的特殊成员函数构造函数 作业 C对C的结构体的扩充 C语言中的结构体&#xff0c;仅仅只是属性&#xff08;变量&#xff09;的聚合体&#xff0c;不可以在结构体中定义行为&#xff08;函数&#xff09;。如果非要在结构体中定…

《自动驾驶与机器人中的SLAM技术》ch2:基础数学知识

目录 2.1 几何学 向量的内积和外积 旋转矩阵 旋转向量 四元数 李群和李代数 SO(3)上的 BCH 线性近似式 2.2 运动学 李群视角下的运动学 SO(3) t 上的运动学 线速度和加速度 扰动模型和雅可比矩阵 典型算例&#xff1a;对向量进行旋转 典型算例&#xff1a;旋转的复合 2.3 …

C语言教程——指针进阶(1)

目录 前言 1、字符指针 2、指针数组 3、数组指针 3.1数组指针 3.2&数组名VS数组名 3.3数组指针的使用 4、数组参数、指针参数 4.1一维数组传参 4.2二维数组传参 4.3一级指针传参 4.4二级指针传参 4.5总结 5、函数指针 5.1思考 总结 前言 我们在之前知道指针…

[应用类App] 轮廓线 aia源码 UI界面精美,画布实现手柄摇杆

屏幕数量&#xff1a;10个&#xff0c;仅主界面近3000代码块&#xff0c;请自行研究参考。 实现了手柄摇杆功能&#xff0c;界面做的比较好。 下载地址&#xff1a;轮廓线 aia源码 UI界面精美&#xff0c;画布实现手柄摇杆 - .aia 案例源码 - 清泛IT社区&#xff0c;为创新赋能…

C++—9、如何在Microsoft Visual Studio中调试C++

本文通过实例操作来介绍 Visual Studio 调试器的功能。调试器在运行过程中可提供许多方法让你查看代码的情况。 你可以逐步浏览代码、查看变量中存储的值、设置对变量的监视以查看值何时改变、检查代码的执行路径、查看代码分支是否正在运行等等。本实例主要是设置断点及查看内…