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

简介: 引用参数和输出参数按照国际惯例,要了解一个东西的时候,首先明白它是什么,然后明白它能做什么,最后要知道为什么。所以在介绍ref和out之前要先简单了解一下什么是引用参数与输出参数,因为使用ref和out要有所了解

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则不需要。

image.png


尽管作为 out 参数传递的变量不必在传递之前进行初始化,但是out也有要求,使用out的时候,必须在方法体内给其赋值,赋值之后可以进行使用,未赋值时不能用,但是ref不需要。

例如下图所示,并未给Refa赋值就可调用,而Outb未赋值之前不可调用,赋值之后才可调用。而且如果方法体内未给Outb赋值的话,VS会报错。

image.png

在使用out的时候,不管有没有对静态变量b赋值,只要出使用out修饰符,就必须对out修饰的参数Outb赋值。

所以out应该是在方法内部做了分配地址的操作,然后把地址赋给外部的变量。但是ref的话是直接传递外部地址进方法。


总结

ref和out传参使用的时候,使用的是所传参的地址,所以在使用之后自身的值会发生改变。

使用ref的时候,必须先给ref的参数赋值才能使用,而out则是在方法体中必须给out的参数赋值,才可使用。


关键字“ref“和”out”之间的唯一区别:使用ref需先赋初值,使用out则需在方法体中赋值。


整体来说,系统对ref的限制是更少一些的。out虽然不要求在调用前一定要初始化,但是其值在函数内部是不可见的,也就是不能使用通过out传进来的值,并且一定要在函数内赋一个值。或者说函数承担初始化这个变量的责任。


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


相关文章
|
8月前
|
C#
C#系列之ref和out的区别
C#系列之ref和out的区别
288 0
|
5月前
|
C# 计算机视觉
C#中out关键字
C#中out关键字
72 0
|
5月前
|
编译器 C# 计算机视觉
C#中的ref关键字
C#中的ref关键字
76 0
|
存储 C# C++
从C++角度讲解C#Out和ref的区别
从C++角度讲解C#Out和ref的区别
C#中out和ref之间的区别
C#中out和ref之间的区别
C#基础⑧——方法(函数、重载、out、ref)
比喻成职能。比喻成一个生产自行车老板,一个地方专门放螺丝,一个地方专门放轮,一个地方专门放车链子,需要组装什么就从那个仓库里面拿就行了。各司其职。
|
关系型数据库 MySQL C#
【C#】【MySQL】【GridView】删除出现Parameter index is out of range
【C#】【MySQL】【GridView】删除出现Parameter index is out of range
137 0
【C#】【MySQL】【GridView】删除出现Parameter index is out of range
C# ref out的使用与区别
ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。Ref型参数引入前必须赋值。 out 关键字会导致参数通过引用来传递。这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字。 Out型参数引入前不需赋值,赋值也没用。
160 0
C# ref out的使用与区别
|
2月前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
44 3
|
23天前
|
存储 安全 编译器
学懂C#编程:属性(Property)的概念定义及使用详解
通过深入理解和使用C#的属性,可以编写更清晰、简洁和高效的代码,为开发高质量的应用程序奠定基础。
83 12