分享

C#基础知识 之 ✨ ref 和 out 之间的江湖趣闻

 敲代码的小Y 2021-12-01

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传进来的值,并且一定要在函数内赋一个值。或者说函数承担初始化这个变量的责任。

就先介绍到这里了,如果还有什么需要补充的或者文章哪里有纰漏都可以评论说一下哦
在这里插入图片描述

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多