C#里面的 out 和ref参数时常会用到,但对它们的区别比较模糊。所以总结一下。下面是测试代码:

 public void Start()
{
//outSum没必要赋值,赋值了也完全没用。
//如果AddByOut函数内部直接使用out对应的参数,会报错:使用了未被赋值的 out 参数a
int outSum = ;
int ov1 = ;
int ov2 = ;
AddByOut(out outSum, ov1, ov2);
Console.WriteLine("outSum : " + outSum + " v1: " + ov1 + " v2: " + ov2); //refSum 必须赋值
int refSum = ;
int rv1 = ;
int rv2 = ;
//如果refSum没有赋值,这里会报错:使用了未赋值的局部变量 refSum
AddByRef(ref refSum, rv1, rv2);
Console.WriteLine("refSum : " + refSum + " v1: " + rv1 + " v2: " + rv2);
} public void AddByOut(out int a, int b, int c)
{
//a = a + b + c;// a 未被赋值,不能直接使用,即使是调用的地方 out对应的参数初始化也没用
a = b + c;
} public void AddByRef(ref int a, int b, int c)
{
a = a + b + c; // 可以直接使用a
}

测试结果:

总结:   1、调用带ref关键字的函数,必须对 ref 对应的参数赋值;而out关键字不需要。

    2、带ref 关键字的函数内部可以直接使用 ref 对应的参数;out 关键字的函数,必须在函数内部对out对应的参数赋值后才能使用。

      (归结1,2点:ref在外面初始化,out在里面初始化)

    3、两个关键字都能使值类型按引用类型使用,即修改了函数外部申明的变量

注:更多专业介绍请参考微软官方文档

out 参数修饰符(C# 参考)  https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/out-parameter-modifier

ref(C# 参考)                      https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/ref

C# out ref 用法总结的更多相关文章

  1. 【vue】vue中ref用法

    1.获取当前元素: 例子: <div class="pop pos-a" :style="{ left: pop_x + 'px' ,top: pop_y + 'p ...

  2. setTimeout和setInterval的unref()和ref()用法

    var testFunction=function(){ console.log("guoyansi"); } var timer=setInterval(testFunction ...

  3. c# ref与out用法

    class Program { static void Main(string[] args) { //普通 : ; ); Console.WriteLine("/*普通:*/") ...

  4. C#之Ref,Out以及TryParse()的用法

    ref和out用法很简单,我记下来也提醒自己要用更好的方式去写代码,不要让代码过于臃肿,让人看得头痛.直接写 ref:ref关键字就是让参数进行传递,但是需要初始化,而out不需要初始化参数 ref用 ...

  5. React ref的用法

    React的ref有3种用法: 1. 字符串(已废弃)2. 回调函数3. React.createRef() (React16.3提供) 1. 字符串 最早的ref用法. 1.dom节点上使用,通过t ...

  6. React Native中ref的用法(通过组件的ref属性,来获取真实的组件)

    ref是什么? ref是组件的特殊属性,组件被渲染后,指向组件的一个引用.可以通过组件的ref属性,来获取真实的组件.因为,组件并不是真正的DOM节点,而是存在于内存中的一种数据结构,称为虚拟的DOM ...

  7. 【又长见识了】函数传参,params参数,ref和out参数详解

    一.原来函数这样传参 先看一个函数和函数调用. static void Main(string[] args) { ; Test(num);//局部变量在使用之前赋值 //Test(10); //直接 ...

  8. C#高级参数ref的使用

    ref关键字用于将方法内的变量改变后带出方法外.具体我们通过例子来说明: 例子中,将变量n1和n2交换了.如果没有加ref参数,由于没有swadDemo()方法没有返回值,调用后,n1和n2是不会交换 ...

  9. ref 和out的区别

    在C#语言中,参数的传递有两种,一种是值传递,一种是引用传递.ref与out这两种方式都属于引用传递,只是他们的用法稍有不同.下面看几个例子 使用ref的例子 class test { static ...

随机推荐

  1. 深入理解 call,apply 和 bind

    在JavaScript 中,call.apply 和 bind 是 Function 对象自带的三个方法,这三个方法的主要作用是改变函数中的 this 指向,从而可以达到`接花移木`的效果.本文将对这 ...

  2. iOS开发之虾米音乐频道选择切换效果分析与实现

    今天博客的内容比较简单,就是看一下虾米音乐首页中频道选择的一个动画效果的实现.之前用mask写过另外一种Tab切换的一种效果,网易云音乐里边的一种Tab切换效果,详情请移步于"视错觉:从一个 ...

  3. 查找最近公共祖先(LCA)

    一.问题 求有根树的任意两个节点的最近公共祖先(一般来说都是指二叉树).最近公共祖先简称LCA(Lowest Common Ancestor).例如,如下图一棵普通的二叉树. 结点3和结点4的最近公共 ...

  4. 听说你的MES系统又失败了?

    前些日子,一位前同事跟我抱怨,他们做的MES系统,凉凉了.这样的话,我从不同人口中听到过不止一次. 我们做的系统,做到一半做不下去了...... 我们的系统,工人都不爱用...... 不只是MES,所 ...

  5. python基础-函数(9)

    一.函数的介绍 如果在开发程序时,需要某块代码多次,但是为了提高编写的效率以及代码的重用,所以把具有独立功能的代码块组织为一个小模块,这就是函数 函数的语法格式: def 函数名(): 函数的功能代码 ...

  6. 1. 容器化部署一套云服务 第一讲 Jenkins(Docker + Jenkins + Yii2 + 云服务器))

    容器化部署一套云服务系列 1. 容器化部署一套云服务之Jenkins 一.购买服务器 服务器

  7. RecyclerViewSelectableAdapterDemo【封装BaseSelectableAdapter用于多选、单选,以及切换选中状态等功能】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 记录封装单选.多选.切换选中状态的BaseSelectableAdapter基类,配合Recyclerview使用. 注意:此Dem ...

  8. 云HBase发布全文索引服务,轻松应对复杂查询

    云HBase发布了“全文索引服务”功能,自2019年01月25日后创建的云HBase实例,可以在控制台免费开启此“全文索引服务”功能.使用此功能可以让用户在HBase之上构建功能更丰富的搜索业务,不再 ...

  9. keil教程之新建软件工程

    前言 工欲善其事,必先利其器.要学好52单片机,就要会用keil写程序.不然,谈何学习单片机.下面介绍keil的使用. keil简介 Keil C51是美国Keil Software公司出品的51系列 ...

  10. headfirst设计模式(5)—工厂模式体系分析及抽象工厂模式

    先编一个这么久不写的理由 上周我终于鼓起勇气翻开了headfirst设计模式这本书,看看自己下一个设计模式要写个啥,然后,我终于知道我为啥这么久都没写设计模式了,headfirst的这个抽象工厂模式, ...