在c#中,使用方法获得返回值时,只能获取一个返回值。当使用ref和out关键字后,可以获取多个返回值。

MSDN对ref和out关键字的说明如下:

ref 关键字: 使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。
 out 关键字:会导致参数通过引用来传递。这与 ref 关键字类似,若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字。

它们的区别在于: ref 要求变量必须在传递之前进行初始化;而out不需要初始(或者初始化也不会影响到方法内部的值,所以你初始化没用),需要在方法内部赋值或者初始化。

我们用一个例子来测试一下ref和out关键字的使用。

首先我们定义一个方法,计算一个int数组中的和,最大值,最小值和平均值。

代码如下:使用ref关键字

  public int GetIntResult(int[] arr,ref int max,ref int min,ref double avg)
{
int sum = ;
max = arr[];
min = arr[];
for (int i = ; i < arr.Length; i++)
{
sum += arr[i]; if (max < arr[i]) max = arr[i];
if (min > arr[i]) min = arr[i]; }
avg = sum / arr.Length;
return sum;
}

在主方法中调用上面的方法代码:

我们先测试当为定义的变量不初始化时,程序会提示什么错误呢?会系统使用了为初始化的变量。所以说在使用ref关键字时,必须对变量初始化。提示错误如下图:

测试使用关键字ref的主方法代码如下:

 int[] arry = new int[] {,,,,,,, };
int max=;
int min=;
double avg= ;
Test test = new Test();
int sum = test.GetIntResult(arry,ref max,ref min,ref avg);//调用时也需要使用关键字
Console.WriteLine($"sum:{sum} max:{max} min:{min} avg:{avg}");

运行程序,测试结果:

使用out关键字,跟测试ref关键字相同。

  int[] arry = new int[] { , , , , , , ,  };
int max=;////在使用out关键字时,不需要在此处初始化,初始化也不会影响到方法内部的值,所以你初始化没用
int min=;
double avg=;
Test test = new Test();
int sum = test.GetIntResult(arry, out max, out min, out avg);//调用时也需要使用关键字
Console.WriteLine($"sum:{sum} max:{max} min:{min} avg:{avg}");

测试结果跟上面。

我们来继续同时使用ref和out关键字测试。代码如下:

   public string GetStringResult(string code,ref string name,out int age)
{
age = ; //
//deSomething..........
return code;
}

主方法调用测试上面方法代码如下:

  string code = "x9527";
string name = "詹姆斯邦德";
int age = ;//我们在这里赋值,等运行的时候看看.....会输出什么
Test test = new Test();
string strCode= test.GetStringResult(code,ref name,out age);
Console.WriteLine($"name={name} code={code} age={age}");

测试运行结果:

c#中ref和out使用及区别的更多相关文章

  1. Spring中Bean的命名问题(id和name区别)及ref和idref之间的区别

    Spring中Bean的命名 1.每个Bean可以有一个id属性,并可以根据该id在IoC容器中查找该Bean,该id属性值必须在IoC容器中唯一: 2.可以不指定id属性,只指定全限定类名,如: & ...

  2. (转)Spring中Bean的命名问题(id和name区别)及ref和idref之间的区别

    Spring中Bean的命名 1.每个Bean可以有一个id属性,并可以根据该id在IoC容器中查找该Bean,该id属性值必须在IoC容器中唯一: 2.可以不指定id属性,只指定全限定类名,如: & ...

  3. Spring中Bean的命名问题及ref和idref之间的区别

    一直在用Spring,其实对其了解甚少,刚去了解了一下Spring中Bean的命名问题以及ref和idref之间的区别,略作记录,以备后查. Spring中Bean的命名 1.每个Bean可以有一个i ...

  4. C#中ref和out的区别浅析

    这篇文章主要介绍了C#中ref和out的区别浅析,当一个方法需要返回多个值的时候,就需要用到ref和out,那么这两个方法区别在哪儿呢,需要的朋友可以参考下   在C#中通过使用方法来获取返回值时,通 ...

  5. Spring中<ref local=""/>与<ref bean=""/>区别

    小 Spring中<ref local=""/>与<ref bean=""/>区别 (2011-03-19 19:21:58) 转载▼ ...

  6. property中ref、value、name的区别

    转载: 版权声明:本文为CSDN博主「qq_36098284」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net ...

  7. C#中ref和out的使用与区别

    C#中ref关键字和out关键字所实现的功能差不多,都是指定一个形参按照引用传递而不是实参的副本传递.但是二者适用场景还是有些区别的:out适合用在需要retrun多个返回值的地方,而ref则适合用在 ...

  8. java 中sendredirect()和forward()方法的区别

     一.文章1 HttpServletResponse.sendRedirect与RequestDispatcher.forward方法都可以实现获取相应URL资源. sendRedirect实现请求重 ...

  9. C#中??和?分别是什么意思? 在ASP.NET开发中一些单词的标准缩写 C#SESSION丢失问题的解决办法 在C#中INTERFACE与ABSTRACT CLASS的区别 SQL命令语句小技巧 JQUERY判断CHECKBOX是否选中三种方法 JS中!=、==、!==、===的用法和区别 在对象比较中,对象相等和对象一致分别指的是什么?

    C#中??和?分别是什么意思? 在C#中??和?分别是什么意思? 1. 可空类型修饰符(?):引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.例如:string str=null; ...

随机推荐

  1. C语言中scanf函数的实现

    接上一篇C语言中可变参数函数实现原理,从理论上详细介绍了C语言中可变参数函数的实现,这一篇从minix内核源码中的scanf函数入手,学习C语言经典可变参数函数的实现过程 在scanf.c文件中,可以 ...

  2. 通过Adb 查看当前正在运行的Activity.

    extends:http://www.cnblogs.com/tt_mc/p/4269833.html adb shell dumpsys activity activities | sed -En ...

  3. freemarker了解

    今天主要了解了项目流程,了解了这周要做退款详情迁移,了解了freemarker

  4. Shell while

    while commanddo ...done c=0while [ $c -lt 5 ]do c='expr $c+1' echo $cdone

  5. python标准库和第三方库的区别

    1.python的标准库是随着pyhon安装的时候默认自带的库. 2.python的第三方库,需要下载后安装到python的安装目录下,不同的第三方库安装及使用方法不同. 3.它们调用方式是一样的,都 ...

  6. 9.13Django ORM那些事

    2018-9-13 14:23:22 ORM那些事  参考 : https://www.cnblogs.com/liwenzhou/p/8660826.html 今天的都是ORM的查询 更详细进阶了! ...

  7. Solve Error: 'has incomplete type', foward declaration of 'class x'

    在C++的OOB编程中,有时候我们会遇到这样的错误Error: 'has incomplete type',forward declaration of 'class x',那么是什么原因引起的这个问 ...

  8. iOS核心动画の摘记

  9. 初识Spring Webflux

    Important to know is that there are two ways to use Spring Webflux. One using annotations, which is ...

  10. php iconv() : Detected an illegal character in input string

    php iconv() : Detected an illegal character in input string_php技巧_脚本之家 https://www.jb51.net/article/ ...