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

其次: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. 强制转https

    原文:http://blog.csdn.net/wzy_1988/article/details/8549290 需求简介 基于nginx搭建了一个https访问的虚拟主机,监听的域名是test.co ...

  2. R语言——包的添加和使用

    R是开源的软件工具,很多R语言用户和爱好者都会扩展R的功能模块,我们把这些模块称为包.我们可以通过下载安装这些已经写好的包来完成我们需要的任务工作. 包下载地址:https://cran.r-proj ...

  3. Linux命令 tar 打包解压缩

    --打包:tartar -cvf 命名文件.tar 要压缩的目录tar -xvf 要解压的包.tartar -tf  要查看的包.tartar -f 包.tar -r file             ...

  4. RDLC 聚合函数按条件求和,显示"错误号"

    =Sum(IIf(Fields!AValue.Value >0,Val(Fields!AValue.Value),)) 一直显示错误号 修改为 =Sum(IIf(Fields!AValue.Va ...

  5. Android-操作栏之选项菜单

    回答第一个问题:什么是选项菜单?答:选项菜单就是可以显示在操作栏上的菜单. 菜单的视图需要建立在res/menu下. 其中,showAsAction属性用于指定菜单选项是显示在操作栏还是隐藏到溢出菜单 ...

  6. Content-Disposition的作用及用法

    Content-disposition 是 MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件.Content-disposition其实可以控制用户请求所得的内容存为一个 ...

  7. PHP扩展开发(1)-创建基础框架

    生成PHP扩展开发的基础框架.   一.Linux下   $>cd ~/{php源码}/ext $>./ext_skel --extname=simple   Creating direc ...

  8. PHP二维数组排序函数

    PHP一维数组的排序可以用sort(),asort(),arsort()等函数,但是PHP二维数组的排序需要自定义. 以下函数是对一个给定的二维数组按照指定的键值进行排序,先看函数定义: functi ...

  9. C程序设计语言练习题1-12

    练习1-12 编写一个程序,以每行一个单词的行驶打印其输入. 代码如下: #include <stdio.h> // 包含标准库的信息. int main() // 定义名为main的函数 ...

  10. 工程和界面—Webstorm入门指南 Webstorm中的工程-备

    1.新建工程 “Quick Start”界面新建工程: 也可以点击顶部菜单栏“File”-> “New Project”. 弹出如下界面: “Location”指向想要创建的工程目录(如果该目录 ...