C# 初识Ref和Out
首先:两者都是按地址传递的,使用后都将改变原来参数的数值。
其次:ref可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。这个就是两个的区别,或者说就像有的网友说的,ref是有进有出,out是只出不进。
ref(C# 参考)
ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。我们先看下普通的传参:
一、普通方法
int n1 = 5;
MyFun(n1);
Console.WriteLine(n1);
public static void MyFun(int i)
{
i = i + 5;
}
毫无疑问调用输出:5
二、带ref参数的方法
public static void MyRef(ref int i)
{
i = i + 5;
}
Static Void Main()
{
int n2 = 5;
//int n2; //该变量为初始化直接使用ref传参是错误的
MyRef(ref n2);
Console.WriteLine(n2);
}
这次输出是什么呢?结果是10,因为你ref是引用传值,直接改变n2的值.
out(C# 参考)
out 关键字会导致参数通过引用来传递。这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字。
public static void MyOut(out int i)
{
i = 5 + 5;
}
int n3 = 5;
MyOut(out n3);
Console.WriteLine(n3);
结果输出:10
尽管作为 out 参数传递的变量不必在传递之前进行初始化,但需要调用方法以便在方法返回之前赋值。
四、带params参数的方法
params 参数对应的是一个一维数组: int、string等
在方法的参数列表中只能有一个params 参数
当有多个参数时,params 参数必须放在参数列表的最后
public static void MyParams(string str, params int[] arr)
{
foreach (int n in arr)
{
Console.WriteLine(n);
}
}
MyParams("xg", 11, 22);
输出结果:11,22
using System;
using System.Collections.Generic;
using System.Text; namespace Test
{
class Class1
{
static void Main(string[] args)
{
int n1 = ;
MyFun(n1); //一、普通方法
Console.WriteLine(n1); int n2 = ;
MyRef(ref n2); //二、带ref参数的方法
Console.WriteLine(n2); int n3 = ;
MyOut(out n3); //三、带out参数的方法
Console.WriteLine(n3); MyParams("xg", , ); //四、带params参数的方法
MyParams("xg", , , , ); int number=;
Modify(ref number);
Console.WriteLine(number); int number1;
TestOut(out number1);
Console.WriteLine(number1); Console.ReadLine();
}
//一、普通方法
public static void MyFun(int i)
{
i = i + ;
}
//二、带ref参数的方法
public static void MyRef(ref int i)
{
i = i + ;
}
//三、带out参数的方法
public static void MyOut(out int i)
{
i = + ;
} //四、带params参数的方法
// params 参数对应的是一个一维数组: int、string等
// 在方法的参数列表中只能有一个params 参数
// 当有多个参数时,params 参数必须放在参数列表的最后
public static void MyParams(string str, params int[] arr)
{
foreach (int n in arr)
{
Console.WriteLine(n);
}
}
public static void Modify(ref int number)
{
number = ;
}
public static void TestOut(out int i)
{
i = ;
}
}
}
C# 初识Ref和Out的更多相关文章
- [CDH] Acquire data: Flume and Kafka
Flume 基本概念 一.是什么 Ref: http://flume.apache.org/ 数据源获取:Flume.Google Refine.Needlebase.ScraperWiki.Bloo ...
- 初识轻量级Java开源框架 --- Spring
初识轻量级Java开源框架 --- Spring 作者:egg 微博:http://weibo.com/xtfggef 出处:http://blog.csdn.net/zhangerqing spri ...
- ES-6常用语法和Vue初识
一.ES6常用语法 1.变量的定义 1. 介绍 ES6以前 var关键字用来声明变量,无论声明在何处都存在变量提升这个事情,会提前创建变量. 作用域也只有全局作用域以及函数作用域,所以变量会提升在函数 ...
- JQuery制作网页——第五章 初识 jQuery
1.jQuery简介: ● jQuery由美国人John Resig于2006年创建 ● jQuery是目前最流行的JavaScript程序库,它是对JavaScript对象和函数的封装 ● 它的设计 ...
- 初识quartz 并分析 项目中spring整合quartz的配置【原创+转载】
初识quartz 并分析 项目中spring整合quartz的配置[原创+转载]2018年01月29日 12:08:07 守望dfdfdf 阅读数:114 标签: quartz 更多个人分类: 工具 ...
- spring transaction 初识
spring 事务初识 1.spring事务的主要接口,首先盗图一张,展示出spring 事务的相关接口.Spring并不直接管理事务,而是提供了多种事务管理器,他们将事务管理的职责委托给Hibern ...
- 【初识Spring】对象(Bean)实例化及属性注入(xml方式)
title: [初识Spring]对象(Bean)实例化及属性注入(xml方式) date: 2018-08-29 17:35:15 tags: [Java,Web,Spring] --- #初识S ...
- 深入理解Spring(一):初识Spring
深入理解Spring(一):初识Spring 一. Spring介绍 Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnso ...
- 初识SpringIOC
初识SpringIOC 简介 IOC(Inversion of Control)控制反转.指的是获取对象方式由原来主动获取,到被动接收的转变.在Spring中,IOC就是工厂模式解耦,是Srping框 ...
随机推荐
- DataTables 配置和使用
WEB后台开发,如果用的是Bootstrap框架,那这个表格神器你一定不要错过. 官方地址:https://datatables.net/ What?英文不好,没关系咱有中文的 http://data ...
- SQL通用函数-nvl-nvl2 -nvlif-nullif-coalesce-decode-case
通用函数适用于任何类型数据(包括空值),一般用于实现空值处理.条件运算和多路分支结果,下面介绍其中常用的几种: nvl(exp1, exp2) 函数nvl(exp1, exp2)用于将空值转换为指定的 ...
- Xcode7国际化(根据系统语言切换App显示的语言) - 元宵节快乐!
老规矩, 上gif 下面是配置的大概流程: 这个是要显示中文的.strings文件的内容和格式 这个是要显示英文的.strings文件的内容和格式 下面是应用名部分: 然后下面是代码部分: impor ...
- Width vs Pitch
1.单位不同,width是像素,pitch是字节.因此一个640*480的8位图和640*480的32位 图他们width一样而pitch不一样. 2.pitch可能大于width个像素所占字节数.w ...
- MongoDB在win7下安装配置
1.在MongoDB官网下载最新版本,并且安装 2.解压后在MongoDB文件目录下创建data文件夹和log文件夹,并且在log文件夹中新建mongodb.log文件 3.新建一个配置文件mongo ...
- 【Node.js】Event Loop执行顺序详解
本文基于node 0.10.22版本 关于EventLoop是什么,请看阮老师写的什么是EventLoop 本文讲述的是EventLoop中的执行顺序(着重讲setImmediate, setTime ...
- 3月26日html(七)window document
---恢复内容开始--- 1.Window.document对象 一.找到元素: docunment.getElementById("id"):根据id找,最多找一个: v ...
- php魔术方法——属性重载方法
php有一类很神奇的方法,这些方法是保留方法,通常不会在外部被显式调用,他们使用双下划线(__)开头,他们被称为魔术方法(Magic Methods).php官方也不建议定义其他双下划线开头的方法. ...
- DEDE栏目内容调用
{dede:sql sql='Select content from dede_arctype where id=1'} [field:content/] {/dede:sql},
- JavaWeb学习笔记--filter开发
介绍自定义的Filter类必须实现Filter接口,并且实现Filter接口定义的init() doFilter() destory()方法.其中init为初始化,destory为销毁 doFilte ...