在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. 小米2s线刷出现remote: partition table doesn't exist

    =================问题============ 小米2s线刷出现remote: partition table doesn't exist =================解决方案= ...

  2. U盘安装Centos7.1操作系统的问题记录

    需要的软硬件环境>>>>>>>>>>>>>>>>>1.服务器(笔者用的笔记本).U盘2.Cento ...

  3. Shiro - 轻量级Java 安全框架

    Apache Shiro 是一个强大易用的 Java 安全框架,提供了认证.授权.加密和会话管理等功能,对于任何一个应用程序,Shiro 都可以提供全面的安全管理服务. 并且相对于其他安全框架,Shi ...

  4. HDU - 5961 传递 想法,bfs

    题意:给你一个有向图,满足去掉方向是完全图,将其拆成PQ两个图(没有公共边),问你两图是否分别满足对于任意3个点a,b,c 若有一条边从a到b且有一条边从b到c ,则同样有一条边从a到c. 题解:观察 ...

  5. 2018/03/11 每日一个Linux命令 之 top

    每日一个Linux命令 之 top   今天在公司测试服务器上跑了一个我写的功能[本地测试过的],但是不知道怎么跑了个无限死循环出来,一个文件的体积在不停的变大,如果不管的话这能行? 上去一看,PHP ...

  6. 2018/03/10 每日一个Linux命令 之 cksum

    每日一个Linux命令 2018-03-10 Linux 命令 cksum cksum [文件]  今天楼下的一个大妈去世了,不仅感叹,现如今,真的和以前不一样了,楼上楼下都不知道住的是谁? cksu ...

  7. spring读取配置文件内容并自动注入

    添加注解: @PropertySource(value={"classpath:venus.properties"}) 示例: import org.springframework ...

  8. Python开发【笔记】:谁偷了我的内存?

    内存占用 Sayings: 最近被线上程序内存泄漏的问题搞的挺头大(程序在运行中内存占用不断的扩大),便开始看python内存垃圾回收机制.弱引用.循环引用相关的文章,着重查了一下自己的程序是不是真的 ...

  9. Socket通信的Python实现

    Python中实现socket通信,socket通信的服务端比较复杂,而客户端非常简单,所以客户端基本上都是用sockct模块实现,而服务 端用有很多模块可以使用.下面就说一下服务端可使用的模块. 模 ...

  10. javaScript高级教程(三) javaScript不支持关联数组,只是语法上像关联数组

    1.在js中所有要素都是继承自Object对象的,任何对象都能通过obj['name'] = something的形式来添加属性,相当于obj.name=something. 之所以设计中括号这种存取 ...