关于ref和out

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

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

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则是要求在函数内部必须改变,但不必在传入之前初始化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值