方法参数可以划分为一下四种类型
1 值参数:声明时不含任何修饰符
2 引用参数:以ref修饰符声明
3 输出参数:以out修饰符声明
4 参数数组:以params修饰符声明

引用参数和输出参数不创建新的存储位置。简单的说

引用参数既能将值带进方法,也能将值带出方法——有进有出(ref)
输出参数不能将值带进方法,只能将值带出方法——只出不进(out)

 

可参考:msdn out ref params

口诀:ref有进有出,out只出不进!

在C#中既可以通过值传递也可以通过引用传递参数。通过引用传递参数允许函数成员更改参数的值,并保持该更改。若要通过引用传递参数,可给相应的参数使用ref或者out关键字。其作用很像C中的指针。

ref的用法:

 namespace ConsoleApplicationTest20160125
{
class Program
{
static void Main(string[] args)
{
string a="初始化!";
refMethod(ref a);
Console.WriteLine("ref关键字的用法测试!\t");
Console.WriteLine("结果:a="+a);
Console.ReadKey();
} private static void refMethod(ref string a)
{
a = "执行了ref!";
} }

运行结果:

ref关键字的用法测试!
结果:a=执行了ref!

out的用法:

 namespace ConsoleApplicationTest20160125
{
class Program
{
static void Main(string[] args)
{
string b;//无需初始化
outMethod(out b);
Console.WriteLine("out关键字的用法测试!\t");
Console.WriteLine("结果:b=" + b);
Console.ReadKey(); } private static void outMethod(out string b)
{
b = "执行了out!";
}
}
}

运行结果:
out关键字的用法测试
结果:b=执行了out!

ref和out的区别:

1.ref修饰的参数,传参前必须先初始化,否则会报错。而out,必须在方法中对其完成初始化(赋值)。

2.使用ref和out时,定义方法的参数和执行(调用)方法时,都有在对应参数加ref或out关键字,以满足匹配。

3.out适用于在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。

4.ref参数在方法体内外始终操作的是同一个引用,而out参数只将一个对象赋给传入的引用。

5.out类型的参数只用于输出,不能传入参数,ref侧重于修改,out更侧重于输出。

使用out时的注意点:

1.带有out参数的方法仍然可以返回一个值。一个方法可以有一个以上的out参数。

2.若要使用 out 参数,必须将参数作为 out 参数显式传递到方法。

3.out参数传递前不比初始化,但必须在方法返回之前为其赋值。

4.属性不是变量,不能作为out参数传递。

一个另类的比喻:

0.0...

你拿个鸡蛋给别人加工成蛋糕,那这个蛋糕(或这个蛋)是ref的
如果你给别人一个蛋,别人马上给你一个蛋糕,那这个蛋糕是out的

ref、out补充:

1.ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。

2.如果一个方法采用 ref 参数,而另一个方法采用 out 参数,则无法重载这两个方法。但是,如果一个方法采用 ref 或 out 参数,而另一个方法不采用这两个参数,则可以进行重载。

//一、不可以重载的情况
class CS0663_Example
{
// Compiler error CS0663: "cannot define overloaded
// methods that differ only on ref and out".
public void SampleMethod(ref int i) { }
public void SampleMethod(out int i) { }
} //二、可以重载的情况
class RefOutOverloadExample
{
public void SampleMethod(int i) { }
public void SampleMethod(ref int i) { }
}

params用法:

using System;
public class MyClass
{
public static void UseParams(params int[] list)
{
for (int i = 0 ; i < list.Length; i++)
{
Console.WriteLine(list[i]);
}
Console.WriteLine();
}
public static void UseParams2(params object[] list)
{
for (int i = 0 ; i < list.Length; i++)
{
Console.WriteLine(list[i]);
}
Console.WriteLine();
}
static void Main()
{
UseParams(1, 2, 3);
UseParams2(1, 'a', "test");
int[] myarray = new int[3] {10,11,12};
UseParams(myarray);
}
}

当需要传递多个参数,或参数个数不定的时候,就可以用params类型的参数。

params类型的参数搭配数组使用,实现一个不定长的数组参数  最常用的应该是Console.WriteLine,其中有一个重载如下:  public static void WriteLine(string FormatString, params object[] values);

常见的调用方式:Console.WriteLine("宽:{0},高:{1}",this.Width,this.Height);  前面的"宽:{0},高:{1}"被装入FormatString  this.Width,this.Height被装入values[0]和values[1]之中,如果我们再加几个参数上去,那将按下标继续存入数组中

ref 和 out 的用法和区别以及params用法的更多相关文章

  1. ref和out的用法和区别。

    关于ref和out的用法和区别在网上已经有很多的解释,这里只不过是写下对于我而说比较容易理解的解释. ref和out都可以用来在函数中返回数据,类似于c++中指针. 参数 Ref Out 是否一定需要 ...

  2. C#中??和?分别是什么意思? 在ASP.NET开发中一些单词的标准缩写 C#SESSION丢失问题的解决办法 在C#中INTERFACE与ABSTRACT CLASS的区别 SQL命令语句小技巧 JQUERY判断CHECKBOX是否选中三种方法 JS中!=、==、!==、===的用法和区别 在对象比较中,对象相等和对象一致分别指的是什么?

    C#中??和?分别是什么意思? 在C#中??和?分别是什么意思? 1. 可空类型修饰符(?):引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.例如:string str=null; ...

  3. set和enum类型的用法和区别

    mysql中的set和enum类型的用法和区别 mysql中的enum和set其实都是string类型的而且只能在指定的集合里取值, 不同的是set可以取多个值,enum只能取一个值.   1 2 3 ...

  4. OC #import和@class的用法和区别

    OC #import和@class的用法和区别 import会包含这个类的所有信息,包括实体变量和方法,而@class只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定义的,暂时不用考虑, ...

  5. HashMap、HashTable、LinkedHashMap和TreeMap用法和区别

    Java为数据结构中的映射定义了一个接口java.util.Map,它有四个实现类,分别是HashMap.HashTable.LinkedHashMap和TreeMap.本节实例主要介绍这4中实例的用 ...

  6. 脚本引用中的defer和async的用法和区别

    之前的博客漫谈前端优化中的引用资源优化曾经提到过脚本引用异步设置defer.async,没有细说,这里展开一下,谈谈它们的作用和区别,先上张图来个针对没用过的小伙伴有个初始印象: 是的,就是在页面脚本 ...

  7. spring 后置处理器BeanFactoryPostProcessor和BeanPostProcessor的用法和区别

    主要区别就是: BeanFactoryPostProcessor可以修改BEAN的配置信息而BeanPostProcessor不能,下面举个例子说明 BEAN类: package com.spring ...

  8. $.extend()和$.fn.extend()用法和区别

    $.extend()和$.fn.extend()用法和区别: 在自己制作插件的时候会经常用到$.extend()和$.fn.extend()两个函数,无论从外观还是作用都非常的类似,但是实际上它们的区 ...

  9. kmalloc/kfree,vmalloc/vfree函数用法和区别

    http://blog.csdn.net/tigerjibo/article/details/6412881 kmalloc/kfree,vmalloc/vfree函数用法和区别 1.kmalloc ...

随机推荐

  1. 前端开发之JavaScript基础篇四

    主要内容: 1.定时器 2.正则表达式入门 3.元字符 4.正则表达式实战运用 一.定时器 javaScript里主要使用两种定时器,分别是:setInterval()和setTimeout(). 1 ...

  2. Linux实战教学笔记26:http协议原理

    目录 第二十六节 http协议原理 第1章 Web服务基础 1.1 http服务重要基础 1.2 HTTP协议 1.3 HTTP资源 1.4 网站流量度量术语 1.5 www服务软件介绍 1.6 本章 ...

  3. C++11之 auto

    [C++11类型推导] 1.使用auto的时候,编译器根据上下文情况,确定auto变量的真正类型.auto在C++14中可以作为函数的返回值,因此auto AddTest(int a, int b)的 ...

  4. 排查MySQL事务没有提交导致 锁等待 Lock wait timeout exceeded

    解决思路: select * from information_schema.innodb_trx 之后找到了一个一直没有提交的只读事务, kill 到了对应的线程后ok 了. 转载自:http:// ...

  5. java程序员应该熟悉的20个有用的库(转)

    优秀且经验丰富的Java开发人员的一个特点是API的广泛知识,包括JDK和第三方库.我花了很多时间学习API,特别是在阅读Effective Java 3rd Edition之后,Joshua Blo ...

  6. Library not found for -lAPOpenSdk

    多人开发合作的时候 总是会遇见各种各样的问题 今天就来讲一个关于友盟的问题 在我的小伙伴 用cocoapods 中添加了这样一句话 pod ‘UMengSocialCOM’,  并且pod updat ...

  7. Linux虚拟机磁盘扩容

    扩容步骤如下: 1.添加一块物理硬盘 2.fdisk将硬盘分区,选primary分区,创建1-4个 3.分区类型格式化,选择t,输入LVM代号 4.分好后按w退出 如果是调整原有逻辑卷大小,则先调整原 ...

  8. 制作initramfs/initrd镜像

    Linux kernel在自身初始化完成之后,需要能够找到并运行第一个用户程序(这个程序通常叫做"init"程序).用户程序存在于文件系统之中,因此,内核必须找到并挂载一个文件系统 ...

  9. vmware workstation环境下虚拟机固定ip的设置

    一.准备 (1)vmware workstation (2)centOS 6.5 二.配置 采用nat模式对虚拟机进行固定ip配置,nat模式相当于在windows的操作系统下构建了一个独立的内部局域 ...

  10. java的static块及相关内容

    原文地址:http://blog.csdn.NET/lubiaopan/article/details/4802430     感谢原作者! static{}(即static块),会在类被加载的时候执 ...