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


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


相关文章
|
2月前
|
C#
C#系列之ref和out的区别
C#系列之ref和out的区别
|
9月前
|
存储 C# C++
从C++角度讲解C#Out和ref的区别
从C++角度讲解C#Out和ref的区别
|
8月前
|
C#
C#中out和ref之间的区别
C#中out和ref之间的区别
|
10月前
|
C#
C#基础⑧——方法(函数、重载、out、ref)
比喻成职能。比喻成一个生产自行车老板,一个地方专门放螺丝,一个地方专门放轮,一个地方专门放车链子,需要组装什么就从那个仓库里面拿就行了。各司其职。
|
关系型数据库 MySQL C#
【C#】【MySQL】【GridView】删除出现Parameter index is out of range
【C#】【MySQL】【GridView】删除出现Parameter index is out of range
95 0
【C#】【MySQL】【GridView】删除出现Parameter index is out of range
C# ref out的使用与区别
ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。Ref型参数引入前必须赋值。 out 关键字会导致参数通过引用来传递。这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字。 Out型参数引入前不需赋值,赋值也没用。
125 0
C# ref out的使用与区别
|
.NET C# 开发框架
[C#]浅析ref、out参数
转载:http://www.cnblogs.com/vd630/p/4601919.html#top 按引用传递的参数算是C#与很多其他语言相比的一大特色,想要深入理解这一概念应该说不是一件容易的事,再把值类型和引用类型给参杂进来的话就变得更加让人头晕了。
969 0
|
20天前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。
|
20天前
|
SQL 开发框架 安全
C#编程与多线程处理
【4月更文挑战第21天】探索C#多线程处理,提升程序性能与响应性。了解C#中的Thread、Task类及Async/Await关键字,掌握线程同步与安全,实践并发计算、网络服务及UI优化。跟随未来发展趋势,利用C#打造高效应用。
|
20天前
|
存储 安全 网络安全
C#编程的安全性与加密技术
【4月更文挑战第21天】C#在.NET框架支持下,以其面向对象和高级特性成为安全软件开发的利器。本文探讨C#在安全加密领域的应用,包括使用System.Security.Cryptography库实现加密算法,利用SSL/TLS保障网络传输安全,进行身份验证,并强调编写安全代码的重要性。实际案例涵盖在线支付、企业应用和文件加密,展示了C#在应对安全挑战的同时,不断拓展其在该领域的潜力和未来前景。