前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C#基础知识 之 ✨ ref 和 out 之间的江湖趣闻

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

作者头像
呆呆敲代码的小Y
发布2021-08-12 11:23:33
1.5K0
发布2021-08-12 11:23:33
举报
文章被收录于专栏:呆呆敲代码的小Y 公众号

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的使用

代码语言:javascript
复制
//不使用ref和out
void Method(int a)
{
    a= 100;
}

int a=0;
Method(a);
Console.WriteLine(a);
//输出:0
代码语言:javascript
复制
//使用ref
void Method(ref int Refa)
{
    Refa= 100;
}

int a= 1;
Method(ref a);
Console.WriteLine(a);
**//输出:100**
代码语言:javascript
复制
//使用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传进来的值,并且一定要在函数内赋一个值。或者说函数承担初始化这个变量的责任。

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

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/04/08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ref 和 out 之间的江湖趣闻
    • 引用参数和输出参数
      • ref 和 out 的定义
        • ref和out的使用
          • ref和out的区别
            • 总结
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档