c#和c++区别

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

a. 值传递(Pass by Value)

概念

将参数的副本传递给方法。

方法内对参数的修改不影响原始值。

适用场景

基本数据类型(如int、float、bool)。

不可变类型(如string)。

小型结构体(如DateTime、Point)。

csharp 复制代码
void ChangeValue(int num) {
    num = 100;  // 修改副本,不影响原始值
}

int original = 50;
ChangeValue(original);
Console.WriteLine(original);  // 输出: 50

b. 引用传递(Pass by Reference)

概念

使用ref关键字,将参数的内存地址传递给方法。

方法内对参数的修改直接影响原始值。

适用场景

需要在方法内修改调用者的变量。

避免大型对象的复制开销。

csharp 复制代码
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)。

csharp 复制代码
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);  // 输出: Alice

ChangeReference(person);
Console.WriteLine(person.Name);  // 输出: Alice(引用未变)

重点关注

csharp 复制代码
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++引用的特性

无副本:引用不占用额外内存,只是原始对象的别名。

必须初始化:引用必须在创建时绑定到对象,且不能重新绑定。

相关推荐
劲镝丶16 分钟前
顺序队列与环形队列的基本概述及应用
数据结构·c++
努力也学不会java19 分钟前
【Java并发】揭秘Lock体系 -- condition等待通知机制
java·开发语言·人工智能·机器学习·juc·condition
我需要打球1 小时前
SpringMVC的执行流程
java·servlet
奔跑吧邓邓子1 小时前
【C++实战(53)】C++11线程库:开启多线程编程新世界
c++·实战·多线程·c++11·线程库
l1t1 小时前
编译Duckdb机器学习插件QuackML
数据库·c++·人工智能·机器学习·插件·duckdb
瑞士卷@1 小时前
JDBC进阶之连接池的配置(Druid与HikariCP)
java·开发语言·数据库
xiaopengbc2 小时前
泛型在Java集合框架中的应用有哪些?
java·开发语言·python
沐浴露z2 小时前
一篇文章入门RabbitMQ:基本概念与Java使用
java·分布式·rabbitmq
十五年专注C++开发2 小时前
通信中间件 Fast DDS(三) :fastddsgen的安装与使用
linux·c++·windows·中间件·跨平台
失散132 小时前
分布式专题——24 Kafka功能扩展
java·分布式·云原生·架构·kafka