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

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

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. mysql之使用centos7实现主从复制(读写分离)的实现过程

    什么是主从复制? 主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库:主数据库一般是准实时的业务数据库. 主从复制的作用(好处)! 1.做数据的热备,作为后备数据库,主数据库服务器故 ...

  2. IT和非IT人士:2分钟了解什么是区块链

    本文由  网易云发布. (非IT:阅读常规部分:IT:阅读引用块) 作者:任长存,网易杭州研究院工程师 前言 信息的高速发展,致使互联网风口犹如娱乐圈,移动互联网,微博.直播.共享经济.短视频.小程序 ...

  3. day 57 Bootstrap 第一天

    一 .bootstrap是什么  http://v3.bootcss.com/css/#grid-options(参考博客) 是一个前端开发的框架. HTML CSS JS 下载地址:https:// ...

  4. django系列9--django中的组件(form表单)

    modelform整体 from django import forms from app01 import models import hashlib from django.core.except ...

  5. Weekly Contest 131

    1021. Remove Outermost Parentheses A valid parentheses string is either empty (""), " ...

  6. biz_platform项目过程

    1.前台界面主要采用React框架.通过Ajax方式将数据与tornado服务器交互.以下代码为请求后台数据. var ThisPage = React.createClass({ render: f ...

  7. Ubuntu 16.04LTS安装Nginx

    Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. Nginx 是由 Igor Sysoev ...

  8. java中线程池的几种实现方式

    1.线程池简介:    多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.        假设一个服务器完成一项任务所需时间为:T1 创建 ...

  9. struts2中s:select标签的使用

    1.第一个例子: <s:select list="{'aa','bb','cc'}" theme="simple" headerKey="00& ...

  10. vue 组件之间的数据传递

    父组件传数据给子组件 创建数据 获取json数据 子组件传数据给父组件 1. 子组件使用$emit监听数据 getAreaValues(){ this.$emit('getAreaValues', { ...