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关键字允许传入未初始化参数.
调换一下执行顺序,编译就可以通过啦.