C#基础知识回顾一ref 和 out
今天重新看<<C#图解教程>>发现了里面的一段话:
5.7值参数
有几种参数,它们使用稍微不同的方法从方法传入或传出数据。你到现在一直看到的这种类型是默认的类型,称为值参数
使用值参数,数据通过复制实参到形参的方式传递到方法。方法调用时,系统做如下的操作:
[]在栈中为形参分配空间
[]复制实参到形参
变量在用作实参必须被赋值,对于引用类型,变量可以被赋值为一个引用或者null
PS:值参数和值类型是两个完全不同的概念,值参数是把实参的值复制到形参的参数。
下面这个例子:
class Myclass { public int Val = 20; } class Program { static void Mythod(Myclass f1, int f2) { f1.Val +=5; f2 += 5; } } static void Main() { Myclass a1 = new MyClass(); int a2 = 10; Mythod(a1,a2); } |
[] 在方法被调用之前,用作实参的变量a1,a2已经在栈里面了。
[]随着方法的开始,系统在栈中形参分配空间,并从实参复制值
因为a1是引用类型,所以引用被复制,结果实参和形参都引用堆中的同一个对象
因为a2是值类型,所以值被复制,产生一个独立的数据项
[]在方法的结尾,f2和对象f1的字段都加上了5
[]方法的执行后,形参被栈中弹出
a2,值类型,它的值不受方法的行为的影响
a1,引用类型,但它的值被方法的行为改变了。
那么ref到底有什么用呢,简单的说,就是将值类型的传递类型变成引用传递。
PS:我之前一直以为String类型是引用类型,所以在使用方法后他的值是会改变的,其实不然,String虽然是名义是引用类型,但还是以值传递的方式进行改变的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?