C# 中ref和out的异同点

C# 中ref和out的异同点:

简单概括:

相同点 :

  • ref和out 都是按引用传递

不同点 :

  • ref在调用前必须要初始化,在调用方法内不需要赋值.
  • out在调用前不需要初始化,在调用方法内必须对其赋值.
举个例子,看看ref和out的相同点 :

这里有3个函数,区别在于参数的关键字不同.
这里写图片描述

然后创建3个变量a、b、c 全部赋值1, 分别调用3个不同函数.
这里写图片描述

从结果来看,a的值没有改变,而b和c都因为带有关键字传入引用而改变了值.

证明ref和out 都是按引用传递
这里写图片描述

然后修改一些细节,看看ref和out的不同点 :

让变量b初始不赋值,会产生编译错误,证明ref在调用前必须要初始化.
这里写图片描述

而使用out关键字的变量c,初始不赋值可以编译通过,证明out在调用前不需要初始化.
这里写图片描述

那么问题来了,C#是一种安全的高级程序设计语言,肯定不会出现允许打印未初始化的int值,那么是如何保证安全的呢?

现在把2个函数实现屏蔽掉,再看看编译情况 :
这里写图片描述

结果ref函数编译通过,out函数编译错误,因为out允许初始化不赋值,但是函数内必须赋值,从而保证C#的安全性,也证明了ref方法不需要赋值,out方法内必须对其赋值.

再修改一下两个函数内处理, 看看函数内使用传参的情况 :
这里写图片描述

ref函数允许直接将传参赋值给其他变量,而out函数则不行,同样也是因为out关键字允许传入未初始化参数.

调换一下执行顺序,编译就可以通过啦.
这里写图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值