先总的来说:

通常我们向方法中传递的是值.方法获得的是这些值的一个拷贝,然后使用这些拷贝,当方法运行完毕后,这些拷贝将被丢弃,而原来的值不将受到影响.此外我们还有其他向方法传递参数的形式,引用(ref)和输出(out).

有时,我们需要改变原来变量中的值,这时,我们可以向方法传递变量的引用,而不是变量的值.引用是一个变量,他可以访问原来变量的值,修改引用将修改原来变量的值.变量的值存储在内存中,可以创建一个引用,他指向变量在内存中的位置.当引用被修改时,修改的是内存中的值,因此变量的值可以将被修改.当我们调用一个含有引用参数的方法时,方法中的参数将指向被传递给方法的相应变量,因此,我们会明白,为什么当修改参数变量的修改也将导致原来变量的值.

Ref指明了方法中使用的是引用型参数,引用型参数不开辟新的内存区域。当利用引用型参数向方法传递形参时,编译程序将把实际值在内存中的地址传递该方法。引用型参数通常已经初始化。   
  如   
  int   i=1,j=2;//初始化   
  Swap(ref   i,ref   j);   
    
   Out输出型参数也不开辟新的内存区域,但与引用型参数不同的是,调用方法之前无需对变量进行初始化,输出型参数主要用于传递方法返回的数据。   
  string   name,path;//没有初始化   
  File(out   name,out   path);

首先先说ref:(MSDN)

C# 关键字 | 方法参数

方法参数上的 ref 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。若要使用 ref 参数,必须将参数作为 ref 参数显式传递到方法。ref 参数的值被传递到 ref 参数。传递到 ref 参数的参数必须最先初始化。将此方法与 out 参数相比,后者的参数在传递到 out 参数之前不必显式初始化。

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

如果两种方法的声明仅在它们对 ref 的使用方面不同,则将出现重载。但是,无法定义仅在 ref 和 out 方面不同的重载。例如,以下重载声明是有效的:

class MyClass

{

public void MyMethod(int i) {i = 10;}

public void MyMethod(ref int i) {i = 10;}

}

但以下重载声明是无效的:

class MyClass

{

public void MyMethod(out int i) {i = 10;}

public void MyMethod(ref int i) {i = 10;}

}

示例:

代码

using System;

public class MyClass

{

public static void TestRef(ref char i)

{

// The value of i will be changed in the calling method

i = 'b';

}

public static void TestNoRef(char i)

{

// The value of i will be unchanged in the calling method

i = 'c';

}

public static void Main()

{

char i = 'a'; // variable must be initialized

TestRef(ref i); // the arg must be passed as ref

Console.WriteLine(i);

TestNoRef(i);

Console.WriteLine(i);

}

}

输出

b

b

这里为你说out:

C# 关键字 | 方法参数

方法参数上的 out 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。当希望方法返回多个值时,声明 out 方法非常有用。使用 out 参数的方法仍然可以返回一个值。一个方法可以有一个以上的 out 参数。若要使用 out 参数,必须将参数作为 out 参数显式传递到方法。out 参数的值不会传递到 out 参数。不必初始化作为 out 参数传递的变量。然而,必须在方法返回之前为 out 参数赋值。

如果两个方法的声明仅在 out 的使用方面不同,则会发生重载。不过,无法定义仅在 ref 和 out 方面不同的重载。例如,以下重载声明是有效的:

class MyClass

{

public void MyMethod(int i) {i = 10;}

public void MyMethod(out int i) {i = 10;}

}

而以下重载声明是无效的:

class MyClass

{

public void MyMethod(out int i) {i = 10;}

public void MyMethod(ref int i) {i = 10;}

}

示例:

代码

using System;

public class MyClass

{

public static int TestOut(out char i)

{

i = 'b';

return -1;

}

public static void Main()

{

char i; // variable need not be initialized

Console.WriteLine(TestOut(out i));

Console.WriteLine(i);

}

}

输出

-1

B

params 关键字可以指定在参数数目可变处采用参数的方法参数。

在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 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(); 
}

public static void Main() 

UseParams(1, 2, 3); 
UseParams2(1, 'a', "test");

int[] myarray = new int[3] {10,11,12}; 
UseParams(myarray); 

}

输出 


3



test

10 
11 
12

转载于:https://www.cnblogs.com/greatandforever/archive/2010/04/07/1706001.html

.net中 参数out,ref,params的区别相关推荐

  1. c#中out和ref的使用区别 [转]

    ref是传递参数的地址,out是返回值,两者有一定的相同之处,不过也有不同点.使用ref前必须对变量赋值,out不用. out的函数会清空变量,即使变量已经赋值也不行,退出函数时所有out引用的变量都 ...

  2. C#中out和ref之间的区别【转】

    首先:两者都是按地址传递的,使用后都将改变原来参数的数值. 其次:ref可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所 ...

  3. C#中out和ref使用的区别

    看了网上许多关于out和ref关键字的使用介绍,自己为了方便记住,稍微简略总结了下两者的区别: a. 赋值: (1)ref要求变量使用前必须先赋值(2)out不必要,赋了也没关系,但会清零 b. 传出 ...

  4. Mysql执行计划中eq_ref和ref类型的区别

    下面是一位大佬的回复,我觉得挺好理解的,就来记录下. 文章目录 eq_ref ref eq_ref eq_ref - 想象你有两张桌子.表A包含列(id,text),其中id是主键.表B具有相同的列( ...

  5. .net程序员的盲点(一):参数修饰符ref,out ,params的区别

    C#中有三个关键字-ref,out ,params,虽然本人不喜欢这三个关键字,因为它们疑似破坏面向对象特性.但是既然m$把融入在c#体系中,那么我们就来认识一下参数修饰符ref,out ,param ...

  6. 参数修饰符ref,out ,params的区别

    C#中有三个关键字-ref,out ,params,虽然本人不喜欢这三个关键字,因为它们疑似破坏面向对象特性.但是既然m$把融入在c#体系中,那么我们就来认识一下参数修饰符ref,out ,param ...

  7. c#中out、ref和params的用法与区别

    ref和out都对函数参数采用引用传递形式--不管是值类型参数还是引用类型参数,并且定义函数和调用函数时都必须显示生命该参数为 ref/out形式.两者都可以使函数传回多个结果. 两者区别: 两种参数 ...

  8. C#中方法的参数四种类型(值参数、ref、out、params)详解

    看公司程序偶然看到ref引用,于是查找一了番,现整理如下: 1. 值参数 (不加任何修饰符,是默认的类型)       2. 引用型参数 (以ref 修饰符声明)       3. 输出参数 (以ou ...

  9. C#方法中参数ref和out的解析

    一.C#方法中参数类型 有4种参数类型,有时候很难记住它们的不同特征,下图对它们做一个总结,使之更容易比较和对照. 二.C#方法中的参数 1.值参数 使用值参数,通过复制实参的值到形参的方式把数据传递 ...

  10. C#参考之方法参数关键字:params、ref及out

    params 使用 params 关键字可以指定采用数目可变的参数的方法参数. 可以发送参数声明中所指定类型的逗号分隔的参数列表或指定类型的参数数组. 还可以不发送参数. 如果未发送任何参数,则 pa ...

最新文章

  1. PIXI 下落文字消除(3)
  2. java用户输入解析_Java中的3种输入方式实现解析
  3. SQL Server LOWER Functions
  4. 【django】创建django项目工程
  5. 邻值查找—算法进阶指南
  6. 背景裁剪图片html,HTML5基础加强css样式篇(文本裁剪,背景裁剪:background-origin,background-position,background-clip)(三十七)...
  7. IOS 使用webview 显示 doc/docx/xls/pdf等
  8. linux centos lamp,Linux centos lamp之Apache
  9. 算法分析-堆排序 HeapSort 优先级队列
  10. 干货收藏|如何用chrom插件实现U校园自动刷课
  11. 仿京东首页点击轮播图进入唱片页面
  12. 请解释jsonp的工作原理
  13. atoll C语言实现
  14. 正则表达式过滤联系方式,微信手机号QQ等
  15. win7开机加速怎么设置|win7开机加速的方法
  16. 转载:手机银行技术讨论2
  17. 将Visual Leak Detector集成至Visual Studio 2019
  18. 修改Keil MDK的背景为黑底或护眼(绿色)
  19. fopen函数和文件权限
  20. PRA是个啥?老板表示很满意!

热门文章

  1. IOS transform的使用(移动,放大,旋转)
  2. Spark集群新增节点方法
  3. UVa 621 - Secret Research
  4. PrimaDonna智能咖啡机,咖啡也要私人定制
  5. Maven 项目添加jetty 插件
  6. linux实现防止恶意扫描 PortSentry
  7. Python编写API接口
  8. Android书籍翻页效果需要用到的文件
  9. 七种场景下的软件作业量估计
  10. Emmet的简写演示