C#基础:值类型、引用类型与ref关键字
在C#中,ref的意思是按引用传递。可以参考C++:
- int a = 10, b = 20;
- void swap(int x, int y)
- {
- int temp = x;
- x = y;
- y = temp;
- }
如果简单的调用这个swap,比如:swap(a, b),那么你根本没办法交换这两个变量的值,因为x和y都是形参,在swap返回的时候,x和y都被释放了。但如果是这样定义swap:
- void swap (int& x, int& y)
- {
- int temp = x;
- x = y;
- y = temp;
- }
也就相当于x与a,y与b指向同一个内存地址,那么对x的操作也就相当于对a的操作。那么在C#里面,这种效果对于值类型是很明显的。
- class Program
- {
- static void Test(ref int b)
- {
- b = 2;
- }
- static void Main(string[] args)
- {
- int b = 1;
- Test(ref b);
- Console.WriteLine(b);
- }
- }
此时的输出是2,也就是Test方法中的b与Main中的b指向同一个内存地址,那么对Test.b的操作也就是对Main.b的操作。你如果把程序改成:
- class Program
- {
- static void Test(int b)
- {
- b = 2;
- }
- static void Main(string[] args)
- {
- int b = 1;
- Test(b);
- Console.WriteLine(b);
- }
- }
那么输出的还是1,因为Test.b不是Main.b的引用,也就是一个单独的形参。现在再看对于引用类型,会是什么效果:
- class TestClass
- {
- public int b;
- }
- class Program
- {
- static void Test(TestClass b)
- {
- b.b = 2;
- }
- static void Main(string[] args)
- {
- TestClass b = new TestClass();
- b.b = 1;
- Test(b);
- Console.WriteLine(b.b);
- }
- }
上面的代码,输出的是2,因为b是引用类型,在只需修改b的成员的时候,加不加ref关键字都一样。引用类型本身并不包含数据,仅仅维持了对数据的引用。
因此,使用ref参数,对值类型对象的作用显而易见,而对于引用类型,如需修改引用类型内部的数据,则无需使用ref关键字;否则,当被调用函数内部需要更改引用本身时,比如在函数内部重新定位对象的引用,则需要使用ref关键字。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗