首先:两者都是按地址传递的,使用后都将改变原来参数的数值。

其次: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的更多相关文章

  1. [CDH] Acquire data: Flume and Kafka

    Flume 基本概念 一.是什么 Ref: http://flume.apache.org/ 数据源获取:Flume.Google Refine.Needlebase.ScraperWiki.Bloo ...

  2. 初识轻量级Java开源框架 --- Spring

    初识轻量级Java开源框架 --- Spring 作者:egg 微博:http://weibo.com/xtfggef 出处:http://blog.csdn.net/zhangerqing spri ...

  3. ES-6常用语法和Vue初识

    一.ES6常用语法 1.变量的定义 1. 介绍 ES6以前 var关键字用来声明变量,无论声明在何处都存在变量提升这个事情,会提前创建变量. 作用域也只有全局作用域以及函数作用域,所以变量会提升在函数 ...

  4. JQuery制作网页——第五章 初识 jQuery

    1.jQuery简介: ● jQuery由美国人John Resig于2006年创建 ● jQuery是目前最流行的JavaScript程序库,它是对JavaScript对象和函数的封装 ● 它的设计 ...

  5. 初识quartz 并分析 项目中spring整合quartz的配置【原创+转载】

    初识quartz 并分析 项目中spring整合quartz的配置[原创+转载]2018年01月29日 12:08:07 守望dfdfdf 阅读数:114 标签: quartz 更多个人分类: 工具 ...

  6. spring transaction 初识

    spring 事务初识 1.spring事务的主要接口,首先盗图一张,展示出spring 事务的相关接口.Spring并不直接管理事务,而是提供了多种事务管理器,他们将事务管理的职责委托给Hibern ...

  7. 【初识Spring】对象(Bean)实例化及属性注入(xml方式)

    title: [初识Spring]对象(Bean)实例化及属性注入(xml方式) date: 2018-08-29 17:35:15 tags: [Java,Web,Spring] --- #初识S ...

  8. 深入理解Spring(一):初识Spring

    深入理解Spring(一):初识Spring 一. Spring介绍        Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnso ...

  9. 初识SpringIOC

    初识SpringIOC 简介 IOC(Inversion of Control)控制反转.指的是获取对象方式由原来主动获取,到被动接收的转变.在Spring中,IOC就是工厂模式解耦,是Srping框 ...

随机推荐

  1. linux生成随机密码

    通常情况下大家生成密码都好困惑,一来复杂程度不够会不安全,复杂程度够了又不能手动随便敲击键盘打出一同字符(但通常情况下这些字符是有规律的), 使用1password 或者 keepass 这种软件生成 ...

  2. Shell防DDOS攻击原理

    #!/bin/sh #date:2015-12-13 #filename:fang-DOS.sh  #version:v1.0 while true do     #awk '{print $1}' ...

  3. [serverlet][转载: 深入理解HTTP Session]

    [serverlet][转载: 深入理解HTTP Session] 标签(空格分隔): 未分类 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. ...

  4. Draggable(拖动)组件

    一.加载方式 //class 加载方式 <div id="box" class="easyui-draggable" style="width: ...

  5. (转)弹出窗口lhgDialog API文档

    应用到你的项目 如果您使用独立版本的lhgDialog窗口组件,您只需在页面head中引入lhgcore.lhgdialog.min.js文件,4.1.1+版本做了修改可以和jQuerya库同时引用, ...

  6. \r \r\n \t 的区别

    http://www.360doc.com/content/12/0530/15/16538_214756101.shtml \n 软回车:       在Windows 中表示换行且回到下一行的最开 ...

  7. 第一个Delphi小程序

    第一次应工作需呀,接触这个语言,今晚在自己的电脑搭建好环境,写的第一个超简单的Delphi小程序! var temp:Integer; //求个位数 procedure TForm1.BitBtn1C ...

  8. sqlite3---终端操作

    进入沙盒路径 创建stu.sql数据库 sqlite3 stu.sql 创建表 create table if not exists Student (id integer primary key a ...

  9. 腾讯RTX登录提示失败问题及处理办法

    出现问题时图片: 解决步骤: 首先ping一下RTX管理器所在的的ip地址 telnet一下服务器的端口 8000,8010 是否能通. 具体操作: 在无法登陆的客户端电脑上开始-运行-输入cmd 确 ...

  10. java学习笔记(4):内存管理

    在内存的方面,Java自身带有垃圾运行机制,表面上好像我们可以忽略不计,但是如果我们对其加以理解的话,说不定有时会达到事半功倍的效果. 所以自己花些时间整理一些此类的资料. 一.基本概念 1.栈 对于 ...