关于ref和out

文章讨论了C#中函数参数传递时值类型与引用类型的区别。对于值类型,函数内部的修改不会影响原变量,因为创建了副本。引用类型则共享同一堆内存,可以直接修改。new操作会创建新对象,导致原始引用不变。ref和out关键字用于强制参数在函数内部的修改对调用者可见,ref需预先初始化,out则要求在函数内修改。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       当我们在函数中传入一个参数

这个参数为值类型且在内部需要修改时,例如:

static void test(int a1)
{
   a1=3;
 

}
//以下为方便自己看的伪代码
int a=1;
test(a);//a=1

会发现调用后a的值并没有改变,这里是因为在传入值类型参数时,会定义一个临时的变量,这里称为a1,然后进行的操作其实是a1=a,也就是在栈空间里开辟一个新的房间,再赋值a,所以当我们在函数内部修改时其实是修改的a1,而a并没有改变,所以最后函数调用没有改变a值。

而当传入参数为引用类型时,在不使用new关键字的情况下,可以改变参数,这里是因为引用类型存储在堆中,栈只是存储了地址指向,所以将arr的地址赋值给arr1,让他们在栈中共同指向了一个堆房间。所以改变生效。

static void test1(int[] arr1)
{
   arr1={1,2,3};
 

}
//以下为方便自己看的伪代码
int[] arr={99,98,97};
test(a);//arr={1,2,3}

但是当我们在函数内部使用new关键字生成新的引用参数,则函数不会改变传入参数,同理这里是在堆中生成了新的空间,arr1指向新的房间已经与arr无关了。

static void test1(int[] arr1)
{
   arr1=new int[]{1,2,3};
 

}
//以下为方便自己看的伪代码
int[] arr={99,98,97};
test(a);//arr={99,98,97}

而ref和out就是来解决这样的问题,不同的是ref需要传入的参数必须先初始化,不强制要求在函数内部改变,而out则是要求在函数内部必须改变,但不必在传入之前初始化。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值