不知大家有没有遇到过需要一个函数返回多个值的情况。

当写代码要返回多个值的时候,当然可以返回一个数组来实现,但如果遇到需要返回的多个值的类型不同呢?这个时候怎么办?

c#中,out关键字和ref关键字就起作用了。(且out更适合用到多返回值的地方)

一个函数中,使用out或ref作为形参前的关键字,那么在函数体中只要修改过这个形参,之前调用这个函数时赋给对应形参的实参的值也会修改。这是怎么实现的呢?它的机理就是,使用out 和ref修饰的形参是引用类型,而不是值类型,也就是说它们所存储的信息是地址,而不是值类型。

既然都是存储的地址,那么它们有什么区别呢?
我整理了一下,主要有以下几点区别:
1,ref 要求变量必须在传递之前进行初始化(赋初值),但调用时可以对它什么也不做;而out 在调用*之前*,并不需要为这一形参的变量赋予初始值。
2,out 只能用来将值从方法中传出。不管外界是什么值,使用了out是要把参数清空的,然后函数体中必须对其赋值。也就是说,在调用*之时*的函数体内部必须对out修饰的变量赋值。

简单说就是ref有进有出(或无出),out无进有出。

示例代码如下,

class Program
{ static void Main(string[] args)
{
Program pg = new Program();
int x =;
int y = ;
pg.getnull(ref x, ref y);//这里x,y必须为已经赋过初值的,否则编译不通过
Console.WriteLine("x=" + x + ",y=" + y);//输出为:x=0,y=0,原值没有改变,因为是空方法 pg.GetValue(ref x, ref y);//这里x,y已经赋过初值的
Console.WriteLine("x=" + x + ",y=" + y);//输出为:x=1,y=2
Console.ReadLine(); }
public void getnull(ref int x, ref int y)
{ }
public void GetValue(ref int x, ref int y)
{
x++;
y = y + ;
} }
 class Program
{ static void Main(string[] args)
{
Program pg = new Program();
int x =;
int y = ;
pg.getnull(out x,out y);//这里x,y不需要赋初值,赋了也没关系,但会清零;注意:** 调用函数时必须写关键字out ** 因为参数与关键字是一起传递的
Console.WriteLine("x=" + x + ",y=" + y);//输出为:x=3,y=3,原值没有改变,因为是空方法 pg.GetValue(out x, out y);//这里x,y已经赋过初值的
Console.WriteLine("x=" + x + ",y=" + y);//输出为:x=12,y=21
Console.ReadLine(); } public void getnull(out int x, out int y)//如果函数体中没有给x,y赋初值(即下面函数体为空),那么编辑器会提示“控制离开当前方法之前必须对out参数x赋初值”,编译不通过
{
x = ;//这里我们赋值,不赋值编译不通过
y = ;
}
public void GetValue(out int x, out int y)
{
//x++;//同样如果这么写会提示“使用了未赋值的out参数 x”,所以不可以这么直接 x++
//y = y + 2;//同上 //我们改为下边写法,就可以编译通过
x = ;
y = ;
//这个函数和getnull的功能就完全相同了
}
}

c#中的out和ref的更多相关文章

  1. c#中关键词out和ref的区别

    c#中关键词out和ref用来表明以传引用的方式传递参数. 区别如下: 如果方法的参数用out标记,表示方法被调用前不需初始化参数,方法内不能读取此参数的值,在方法返回前必须向此参数写入值: 如果方法 ...

  2. c#.net中参数修饰符ref,out ,params解析

    params ============================================================================================= ...

  3. C#中的Params、ref、out的区别

    C# Params params params 关键字可以指定在参数数目可变处采用参数的方法参数. 在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params ...

  4. c#中的Out, params,ref 细说并沉淀

    1. Out,params,ref之前先记录平时用的最多的按值传递参数的情况,当然默认情况下参数传入函数的默认行为也是按值传递的. 1: //默认情况下参数会按照值传递 2: static int a ...

  5. C#中的out参数/ref参数/params可变参数

    out参数: out关键字 通过引用来传递参数,在定义方法和调用方法的时候都必须使用out关键字 简单来讲out可以用来返回多个参数类型. static void Main(string[] args ...

  6. C#中的out、ref、params详解

    out参数: 如果你在一个方法中,返回多个相同类型的值的时候,可以考虑返回一个数组.但是,如果返回多个不同类型的值的时候,返回数组就不行了,那么这个时候,我们可以考虑使用out参数.out参数就侧重于 ...

  7. C# 中out 参数 和 ref参数的区别

    C#中共有4种参数类型,分别是 传值(by value), 传址 (by reference), 输出参数 (by output), 数组参数 (by array) by value => 传值 ...

  8. C# 中传参中的OUT 和 ref 区别 笔记

    //out传参前需要对参数进行赋值处理,ref则不需要.//out.ref 传参都可以对值进行改变 1 static void Main(string[] args) { ; //int J = 10 ...

  9. C#中关键字ref与out的区别【转】

    在C#中,ref与out是很特殊的两个关键字.使用它们,可以使参数按照引用来传递.总的来说,通常我们向方法中传递的是值.方法获得的是这些值的一个拷贝,然后使用这些拷贝,当方法运行完毕后,这些拷贝将被丢 ...

随机推荐

  1. 实例化MD5CryptoServiceProvider报错:此实现不是 Windows 平台 FIPS 验证的加密算法的一部分

    System.InvalidOperationException: This implementation is not part of the Windows Platform FIPS valid ...

  2. java 实例化泛型且赋值

    实例化泛型 Class <T> clazz = (Class <T>) ((ParameterizedType) new Entity().getClass().getGene ...

  3. jQuery截取字符串、日期字符串转Date、获取html中的纯文本

    jQuery截取字符串.日期字符串转Date.获取html中的纯文本. var com = com || {}; (function ($, com) { /* * 截取字符串 * @param st ...

  4. NetCore入门篇:(二)Net Core项目创建

    一.新建项目 1.选择菜单:文件 -> 新建 -> 项目 2.选择模板:NET Core -> ASP.NET Core Web 应用程序,输入名称 3.选择框架:ASP.NET C ...

  5. Apache Log4j配置说明

    1.Log4j简介 Log4j是Apache的一个开源项目,它允许开发者以任意间隔输出日志信息.Log4j主要由三大类组件构成: 1)Logger-负责输出日志信息,并能够对日志信息进行分类筛选,即决 ...

  6. Elasticsearch安装与环境配置

    Elasticsearch安装与环境配置 确保机器上已经安装了jdk7以上版本 下载:官网下载地址:https://www.elastic.co/downloads/elasticsearch 将下载 ...

  7. iOS-构建自己的代码块【提高编码效率-Xcode代码块】

    前言 2018年3月1日 农历正月十四 星期四 不知怎么地,一大早上班就想写博客: Xcode代码块 开发中,都不想写过多代码,然后就会用这种方法,去简化代码,包括MVVM框架,它也体现出来了去简化C ...

  8. php内核为变量的值分配内存的几个宏

    在php5.3之前,为某变量分配内存是用宏 MAKE_STD_ZVAL; 737 #define MAKE_STD_ZVAL(zv) \ # /Zend/zend.h738 ALLOC_ZVAL(zv ...

  9. Java的GC

    垃圾收集 在探究Jvm的过程中,有两个点特别需要关注,一是:内存的使用,分配策略,而这一点是在前一篇博客已经介绍过了. 二是:内存的回收.也就是这一篇博客所要探究的关键点. 内存回收需要关注的几个点: ...

  10. 【xsy1122】 路径 点分治+trie

    题目大意:给你一棵n个点的树,树边上有边权,对于每一个点,你要求出经过该点的所有的路径中,路径异或和最大的值. 数据范围:$n≤10^5$,边权$≤10^9$. 我们考虑枚举每一条路径,显然这个是会T ...