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框 ...
随机推荐
- border和outline区别
border和outline区别: border支持box-sizing: border-box,当有边距时,是新增了边框后在按照以前的边距处理 outline不支持box-sizing: borde ...
- 来自GitHub的Android UI开源项目
最近在搞Android开发,做了一个项目后感觉,Android开发入门很是简单,但要能做出用户体验比较完美的APP实在是一件很不容易的事情!要达到一定的水准,估计还需要慢慢的积累,这里先保存一个Git ...
- .Net HttpClient 模拟登录微信公众平台发送消息
1.模拟登录 public WeiXinRetInfo ExecLogin(string name, string pass) { CookieContainer cc = new CookieCon ...
- 找两个string[ ]里不同的元素
方法 1:string[] strListOne = new string[] {"Type", "Parent Id","Status"} ...
- ORACLE基本SQL语句-用户及建表篇
一.用户相关SQL语句 /*新建用户*/create user ; 说明:SA用户名,2013密码 /*授权connect,resource给用户sa*/grant connect,resource ...
- 使用UISegementControl实现简易汤姆猫程序
// // TomViewController.m #import "TomViewController.h" #import <AVFoundation/AVFoundat ...
- php提取身份证号码中的生日日期以及验证是否为未成年人的函数
php 提取身份证号码中的生日日期以及确定是否成年的一个函数.可以同时确定15位和18位的身份证,经本人亲测,非常好用,分享函数代码如下: <?php //用php从身份证中提取生日,包括15位 ...
- Linux编程遇到的问题汇集(持续更新中)
1.源代码编译redis报告错误: undefined reference to `__sync_add_and_fetch_4' 最近项目组在实验Redis,源代码编译的时候,遇到了错误:undef ...
- Java学习笔记--注解
注解的使用与实例:http://www.cnblogs.com/pepcod/archive/2013/02/16/2913474.html 注解的作用及使用方法:http://wenku.baidu ...
- iOS 容易引“起循环引用”的三种场景
笔者在阅读中总结了一下,在iOS平台容易引起循环引用的四个场景: 一.parent-child相互持有.委托模式 [案例]: @interface FTAppCenterMainViewContr ...