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

c#和c++区别

1.在 C# 中,参数传递方式有三种:值传递引用传递

a. 值传递(Pass by Value)
概念
将参数的副本传递给方法。
方法内对参数的修改不影响原始值。
适用场景
基本数据类型(如int、float、bool)。
不可变类型(如string)。
小型结构体(如DateTime、Point)。

void ChangeValue(int num) {num = 100;  // 修改副本,不影响原始值
}int original = 50;
ChangeValue(original);
Console.WriteLine(original);  // 输出: 50

b. 引用传递(Pass by Reference)
概念
使用ref关键字,将参数的内存地址传递给方法。
方法内对参数的修改直接影响原始值。
适用场景
需要在方法内修改调用者的变量。
避免大型对象的复制开销。

void Swap(ref int a, ref int b) {int temp = a;a = b;b = temp;  // 直接修改原始变量
}int x = 10, y = 20;
Swap(ref x, ref y);
Console.WriteLine($"x={x}, y={y}");  // 输出: x=20, y=10

类传递是 引用类型的传递
引用类型(如class、interface、delegate)默认按引用传递值。
方法内可修改对象的属性,但无法修改引用本身(除非用ref)。

class Person {public string Name { get; set; }
}void ChangeName(Person p) {p.Name = "Alice";  // 修改对象属性,影响原始对象
}void ChangeReference(Person p) {p = new Person { Name = "Bob" };  // 修改引用本身,不影响原始引用
}Person person = new Person { Name = "Charlie" };
ChangeName(person);
Console.WriteLine(person.Name);  // 输出: AliceChangeReference(person);
Console.WriteLine(person.Name);  // 输出: Alice(引用未变)

重点关注

void ChangeReference(Person p) {p = new Person { Name = "Bob" };  // 修改引用本身,不影响原始引用
}

这里明显可以看到c#的引用创建的副本 c++引用是别名
C# 引用类型的参数传递机制
在 C# 中,引用类型默认按值传递引用,这意味着:
当你传递一个引用类型(如 Person 对象)时,传递的是引用的副本(即内存地址的复制)。
方法内部有两个独立的引用变量:原始引用和副本。
修改副本引用(如 p = new Person())只会影响副本,不会改变原始引用

c# 引用类型的内存模型
在 C# 中,引用类型的对象存储在堆(Heap)上,而引用变量(如 Person person)存储在栈(Stack)或堆上(取决于变量的作用域)。
关键区别:
引用变量:存储对象的内存地址(通常是 4 字节或 8 字节,取决于系统是 32 位还是 64 位)。
对象本身:存储在堆上,可能占用大量内存(如大型数组、复杂对象图)。

C++引用的特性
无副本:引用不占用额外内存,只是原始对象的别名。
必须初始化:引用必须在创建时绑定到对象,且不能重新绑定。

http://www.xdnf.cn/news/14120.html

相关文章:

  • LLM-大模型原理
  • Agent智能体应用到医疗领域场景有哪些?
  • 缓存击穿,缓存穿透,缓存雪崩的原因和解决方案
  • 【Pandas】pandas DataFrame replace
  • 基于深度学习的智能视频分析系统:技术与实践
  • GO 1.25
  • 计算机网络笔记(四十)——6.3远程终端协议TELNET
  • 【学习笔记】重载和重写的注意事项
  • Java面试题021:一文深入了解微服务之网关Zuul
  • window 显示驱动开发-DirectX VA 2.0 的扩展支持
  • 《Deep Residual Learning for Image Recognition》(深度残差学习在图像识别中的应用)
  • SpringBoot深度解析:从核心原理到最佳实践
  • 用 HTML、CSS 和 JavaScript 实现五子棋人机对战游戏
  • uniapp-vue3-js-vite-pinia-eslint 快速开发模板
  • 初学时间复杂度
  • LSM树与B+树优缺点分析
  • C primer plus (第六版)第七章 编程练习第9题
  • uniapp中vue3 ,uview-plus使用!
  • 阿里云OSS
  • 使用 Higress AI 网关代理 vLLM 推理服务
  • el-tree-select 多选树形下拉框,实现当选中时,根据当前选择的对象,动态生成表单数据。
  • Go并发编程中的内存同步与竞态:从理论到实践
  • 使用Stone 3D免编码快速创建带AI数字人的数字空间
  • Day30 模块和库的导入
  • 安科瑞 ADW600 多回路电力计量模块:安装、通信与使用指南
  • 流编辑器sed
  • 深入理解 C++ const:九大用法解析 + 八大高频考点
  • android mvI架构梳理
  • M - 中位数
  • Android 实体键盘 设置默认布局