23值传递和引用传递
值传递和引用传递
值类型在复制的时候,传递的是这个值得本身。
引用类型在复制的时候,传递的是对这个对象的引用(在堆中的内存地址)。
比如:
写一个类
public class Person
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
}
下面通过复制值类型和引用类型来得出结论
//值传递
int a1 = 10;
int a2 = a1;
a2 = 20;
Console.WriteLine(a1);//10
Console.WriteLine(a2);//20
//引用传递
Person p1 = new Person();
p1.Name = "张三";
Person p2 = p1;//这里是直接给的引用(内存地址),也就是没有new开辟空间,两个对象都用一个空间
p2.Name = "李四";
Console.WriteLine(p1.Name);//李四
上面步骤用图来理解如下:
可以看到,在复制对象给p2时,他们的引用都一样
这样通过方法传参数也是传引用
ref原理也是将值传递变为引用传递
可以看到,在调用方法时,里面的参数和外面的参数在栈上地址一样
字符串虽然也是引用传递,但是它比较特殊,字符串有不可变性,所以每次赋值新的字符串都等于开辟了一个新的空间
string str1 = "张三";
string str2 = str1;
str2 = "李四";
Console.WriteLine(str1);//张三
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构