ref 和 out 之间的江湖趣闻
本片文章将详细介绍一下在C#中的关键字:ref 和 out 的使用和区别 话不多说,下面开始介绍啦
引用参数和输出参数
按照国际惯例,要了解一个东西的时候,首先明白它是什么,然后明白它能做什么,最后要知道为什么。 所以在介绍ref和out之前要先简单了解一下什么是引用参数与输出参数,因为使用ref和out要有所了解
引用参数: 引用参数是一个对变量的内存位置的引用。当按引用传递参数时,与值参数不同的是,它不会为这些参数创建一个新的存储位置。引用参数表示与提供给方法的实际参数具有相同的内存位置。 引用参数在方法中使用时必须为其赋值,并且必须是由变量赋予的值,不能是常量或表达式。如果需要将方法中的每一个参数都设置为ref类型参数,则需要在每一个参数前面加上ref关键字修饰。 在 C# 中,使用 ref 关键字声明引用参数
输出参数: return 语句可用于只从函数中返回一个值。但是,可以使用 输出参数 来从函数中返回两个值。输出参数会把方法输出的数据赋给自己,其他方面与引用参数相似。输出参数相当于返回值,即在方法调用完成后可以将返回的结果存放到输出参数中。 在 C# 中,使用 out关键字声明输出参数
ref 和 out 的定义
简单了解一下引用参数与输出参数,下面就可以对ref和out有一个更清楚的定位和认知了。 再简单介绍一下ref和out ref :“The ref keyword indicates a value that is passed by reference.” ref也是Reference的缩写,意思就是通过引用来传递参数。
out :As a parameter modifier, which lets you pass an argument to a method by reference rather than by value./“out”作为一个参数修饰符,允许您通过引用而不是通过值将参数传递给方法
ref和out的使用
//不使用ref和out
void Method ( int a)
{
a= 100 ;
}
int a= 0 ;
Method ( a) ;
Console. WriteLine ( a) ;
//输出:0
//使用ref
void Method ( ref int Refa)
{
Refa= 100 ;
}
int a= 1 ;
Method ( ref a) ;
Console. WriteLine ( a) ;
* * //输出:100**
//使用out
void Method ( out int Outa)
{
Outa= 100 ;
}
int a;
Method ( out a) ;
Console. WriteLine ( a) ;
//输出:100
上面举了三个简单的方法,分别是不使用修饰符,使用ref,和使用out 可以看出,在使用ref、out后,a的值经过调用了Method方法后是改变了的,就是因为ref和out是用的地址传参 而不使用的时候是按值传参,a的值不会发生变化
ref和out的区别
我们这里着重看一下ref和out的使用区别 用ref的时候,我们需要在调用方法之前给a赋初值,不然就会如下报错,而out则不需要。
尽管作为 out 参数传递的变量不必在传递之前进行初始化,但是out也有要求,使用out的时候,必须在方法体内给其赋值,赋值之后可以进行使用,未赋值时不能用,但是ref不需要。 例如下图所示,并未给Refa赋值就可调用,而Outb未赋值之前不可调用,赋值之后才可调用。而且如果方法体内未给Outb赋值的话,VS会报错。 在使用out的时候,不管有没有对静态变量b赋值,只要出使用out修饰符,就必须对out修饰的参数Outb赋值。 所以out应该是在方法内部做了分配地址的操作,然后把地址赋给外部的变量。但是ref的话是直接传递外部地址进方法。
总结
ref和out传参使用的时候,使用的是所传参的地址,所以在使用之后自身的值会发生改变。 使用ref的时候,必须先给ref的参数赋值才能使用,而out则是在方法体中必须给out的参数赋值,才可使用。
关键字“ref“和”out”之间的唯一区别:使用ref需先赋初值,使用out则需在方法体中赋值。
整体来说,系统对ref的限制是更少一些的。out虽然不要求在调用前一定要初始化,但是其值在函数内部是不可见的,也就是不能使用通过out传进来的值,并且一定要在函数内赋一个值。或者说函数承担初始化这个变量的责任。
就先介绍到这里了,如果还有什么需要补充的或者文章哪里有纰漏都可以评论说一下哦