首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >.NET中ref和out参数的区别?

.NET中ref和out参数的区别?

提问于 2017-12-25 09:32:19
回答 2关注 0查看 368

.NET ref和out.NET 的区别是什么?有什么可以比另一个更有用的情况?什么是一个代码片段,其中一个可以使用,另一个不能?

回答 2

akjok54

发布于 2017-12-25 09:54:39

区别:

ref和out的区别在C# 中,既可以通过值也可以通过引用传递参数。通过引用传递参数允许函数成员更改参数的值,并保持该更改。若要通过引用传递参数, 可使用ref或out关键字。ref和out这两个关键字都能够提供相似的功效,其作用也很像C中的指针变量。它们的区别是:

1、使用ref型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。

2、使用ref和out时,在方法的参数和执行方法时,都要加Ref或Out关键字。以满足匹配。

3、out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。

out

方法参数上的 out 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。

当希望方法返回多个值时,声明 out 方法非常有用。使用 out 参数的方法仍然可以返回一个值。一个方法可以有一个以上的 out 参数。

若要使用 out 参数,必须将参数作为 out 参数显式传递到方法。out 参数的值不会传递到 out 参数。

不必初始化作为 out 参数传递的变量。然而,必须在方法返回之前为 out 参数赋值。

属性不是变量,不能作为 out 参数传递。

最爱开车啦

发布于 2017-12-25 09:53:26

1. ref的使用:使用ref进行参数的传递时,该参数在创建时,必须设置其初始值,且ref侧重于修改;

2. out的使用: 采用out参数传递时,该参数在创建时,可以不设置初始值,但是在方法中必须初始化,out侧重于输出;

注释:当希望方法返回多个值时,可以用out,并且一个方法中的参数可以有一个或多个out参数;使用 out 参数,必须将参数作为 out 参数显式传递到方法中,但是out 参数的值不会被传递到 方法中,且属性不是变量,不能作为 out 参数传递。

ref是有进有出,而out是只出不进。

举例如下:

out的使用

代码语言:txt
AI代码解释
复制
   class Program
代码语言:txt
AI代码解释
复制
    {
代码语言:txt
AI代码解释
复制
        static void Main(string[] args)
代码语言:txt
AI代码解释
复制
        {
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
 
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
     string tmp;    //先声明,但不初始化
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
 
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
     User _user=new User();      
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
 
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
     _user.Name(out tmp);        //调用Name方法
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
 
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
              Console.WriteLine("{0}",tmp); //这时tmp的值为“在这里面赋值了”
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
 
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
              Console.ReadKey(true);
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
 
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
   }
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
 
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
     }
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
 
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
  class User{
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
 
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
    public void Name(out string tmps)
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
 
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
           {
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
       tmps="在这里面赋值了";
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
           }
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
      }
代码语言:txt
复制
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
       使用out结果输出: 在这里面赋值了

ref的使用

代码语言:txt
复制
代码语言:txt
AI代码解释
复制
   class Program
代码语言:txt
AI代码解释
复制
    {
代码语言:txt
AI代码解释
复制
        static void Main(string[] args)
代码语言:txt
AI代码解释
复制
        {
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
     string tmp="传值之前";    //声明并初始化        这时如果输出tmp值为"传值之前"
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
          User _user=new User();
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
              _user.Name(ref tmp);
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
              Console.WriteLine("{0}",tmp);
代码语言:txt
复制
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
              Console.ReadKey(true);
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
        }
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
    }
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
    class User {
代码语言:txt
复制
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
         public void Name(ref string tmps)
代码语言:txt
复制
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
         {
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
              tmps="传值之后";
代码语言:txt
AI代码解释
复制
         }
代码语言:txt
AI代码解释
复制
    }

使用ref方法结果输出:传值之后

和开发者交流更多问题细节吧,去 写回答
相关文章
.net里的ref、out、params参数。
1、ref參數     class Program     {         static void Main(string[] args)         {             int a = 10;             int b = 5;             ChangeNumValue(ref a, ref b);             Console.WriteLine(a + " " + b);             Console.ReadKey();         }
指尖改变世界
2018/08/31
7660
ref 和 out 的区别
ref和out都是C#中的关键字,所实现的功能也差不多,都是指定一个参数按照引用传递。对于编译后的程序而言,它们之间没有任何区别,也就是说它们只有语法区别。
kdyonly
2023/03/03
4280
C# 中的 Out 和 Ref 及Params 参数
out 和ref 参数 经常用来通过方法传递参数来获取值,当您的方法不只有一个返回值的时候,这两个参数就发挥作用了。ref是传递参数的地址,out是返回值,两者有一定的相同之处,不过也有不同点。  在这篇文章里,我将解释如何在c#应用中使用这两个参数。   1、out 参数   out 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。   public class mathClass { public static int TestOu
跟着阿笨一起玩NET
2018/09/18
1.2K0
ref和out的区别在c#中 总结
 ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。简单点说就是,使用了ref和out的效果就几乎和C中使用了指针变量一样。它能够让你直接对原数进行操作,而不是对那个原数的Copy进行操作。 还是以例子来说明吧; 1. ref: int i =0; 有函数fun(ref i)和fun(i) 它们的函数体都是{ i = 3;},那么在执行以下两段代码后: (1)int i = 0; fun(i); System.Console.WriteLi
小小许
2018/09/20
4330
C#中ref和out的区别使用
ref 关键字会导致参数通过引用传递,而不是通过值传递。 通过引用传递的效果是,对所调用方法中的参数进行的任何更改都反映在调用方法中。 例如,如果调用方传递本地变量表达式或数组元素访问表达式,所调用方法会将对象替换为 ref 参数引用的对象,然后调用方的本地变量或数组元素将开始引用新对象。
vv彭
2020/10/27
1.2K0
通俗易懂的ref和out区别
ref 和 out 是C#开发中经常用到的两个关键字,但是很多人没有搞清楚这两个关键字的具体区别,下面我们来说一下这两个关键的区别。
喵叔
2020/09/08
9420
通俗易懂的ref和out区别
C#中ref和out用法简介
ref是传递参数的地址,out是返回值,两者有一定的相同之处,不过也有不同点。   使用ref前必须对变量赋值,out不用。   out的函数会清空变量,即使变量已经赋值也不行,退出函数时所有out引用的变量都要赋值,ref引用的可以修改,也可以不修改。   区别可以参看下面的代码应该就明白了:
zls365
2021/12/06
1.3K0
如何使用out、ref和parms?
【摘要】C#中有三个高级参数,分别是out,ref,params, 你会用吗?
高一峰
2020/09/22
9910
如何使用out、ref和parms?
ref与out
其次:ref可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。这个就是两个的区别.
wfaceboss
2019/04/08
7630
vue3中ref和reactive的区别
大家都知道vue3在9月18号晚上发布了,在vue3中对响应式数据的声明官方给出了ref()和reactive()这两种方式,今天我们来聊聊两种定义定义数据方式有什么不同
用户1880875
2021/08/26
8720
JSP 中 out.print() 和 out.write() 区别
1、print 方法是子类 JspWriter中定义的方法,write 是 Writer 类中定义的方法。
wsuo
2020/07/30
9720
索引器和ref、out关键字
在一个类中,我们可以定义一个索引器,它可以让我们在外部像访问数组元素一样访问类的属性成员。
宿春磊Charles
2022/03/29
2890
索引器和ref、out关键字
C# ref与out
ref参数是引用,out参数为输出参数。 我写一个控制台的程序来说明一下两者的特点和区别: 1 class Program 2 { 3   public static void RefMethod( ref int i) //参数使用了ref关键字 4   { 5     i++; 6   } 7   public static void OutMethod(out int i) //参数使用了out关键字 8   { 9     i = 0; //out参数规定,参数在方法体内必须被初始
拾点阳光
2018/05/10
8840
.NET/C# 使用反射调用含 ref 或 out 参数的方法
2018-09-02 06:59
walterlv
2018/09/18
2.2K0
out.write()和out.print()区别,jsp注释区别
我们现在已经知道JSP是需要先编译成.java,再编译成.class的。其中<%-- ... --%>中的内容在JSP编译成.java时会被忽略的,即JSP注释。
eadela
2019/09/29
7160
2019-11-22-C++CLI的Ref和Out使用
C++/CLI 是一种.NET语言,因此其可以像C#一样使用Ref和Out为函数参数进行标识。
黄腾霄
2020/06/10
7860
java 标准输出与标准错误 out与 err 区别 用法 联系 java中的out与err区别 System.out和System.err的区别 System.out.println和Sy
java 标准输出与标准错误    out与 err 区别 用法 联系  java中的out与err区别  System.out和System.err的区别 System.out.println和System.err.println的区别 Java重定向System.out和System.err
noteless
2018/09/11
1.6K0
java 标准输出与标准错误    out与 err 区别 用法 联系  java中的out与err区别  System.out和System.err的区别 System.out.println和Sy
异步方法不能使用ref和out的解决方法
异常处理汇总-后端系列:http://www.cnblogs.com/dunitian/p/4523006.html 应用场景==》后端现在都是用异步方法,那么分页是必不可少的,于是就有了这个问题 这
逸鹏
2018/04/10
1.6K0
异步方法不能使用ref和out的解决方法
深入源码彻底搞清vue3中reactive和ref的区别
在vue3的日常开发中,我发现很多人都是基于自己的习惯reactive或ref一把梭,虽然这样都可以实现需求,既然这样那为什么已经有了reactive还需要再去设计一个ref呢?这两者的实际运用场景以及区别是什么呢?
inline705
2022/09/27
1.3K0
深入源码彻底搞清vue3中reactive和ref的区别
点击加载更多

相似问题

.NET中的ManualResetEvent和AutoResetEvent有什么区别?

2542

C#函数多个返回值,除了out ref还有什么做法?

1392

怎么实现带out参数的Func <T>?

2139

在C#中:如何复制较少的OUT参数的变量数?

2248

Python中的==和`is`是否有区别?

2383
相关问答用户
腾讯云TDP | TDP会员擅长3个领域
到家集团 | 技术VP擅长5个领域
腾讯云TDP | KOL擅长5个领域
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文