知识大全 .net程序员的盲点(一):ref,out ,params的区别

Posted

篇首语:不操千曲而后晓声,观千剑而后识器。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 .net程序员的盲点(一):ref,out ,params的区别相关的知识,希望对你有一定的参考价值。

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

  NO params

  一个可以让方法(函数)的拥有可变参数的关键字

  原则 在方法声明中的 params 关键字之后不允许任何其他参数 并且在方法声明中只允许一个 params 关键字

  示例(拷贝到vs 中即可用 下面不再说明)

  

  public partial class Form : Form public static void UseParams(params int[] list) string temp = ; for (int i = ; i < list Length; i++)temp = temp + +list[i] ToString(); MessageBox Show(temp); public static void UseParams (params object[] list) string temp = ; for (int i = ; i < list Length; i++)temp = temp + + list[i] ToString(); MessageBox Show(temp); public Form () InitializeComponent(); private void button _Click(object sender EventArgs e) UseParams( ); //看参数是 个UseParams( ); //看参数是 个 可变吧UseParams ( a test ); int[] myarray = new int[ ] ; UseParams(myarray); //看也可以是容器类 可变吧 )

  NO out

  这是一个引用传递L

  原则一 当一个方法(函数)在使用out作为参数时 在方法中(函数)对out参数所做的任何更改都将反映在该变量中

  原则二 当希望方法返回多个值时 声明 out 方法非常有用 使用 out 参数的方法仍然可以返回一个值 一个方法可以有一个以上的 out 参数

  原则三 若要使用 out 参数 必须将参数作为 out 参数显式传递到方法 out 参数的值不会传递到 out 参数

  原则四 不必初始化作为 out 参数传递的变量 因为out 参数在进入方法(函数)时后清空自己 使自己变成一个干净的参数 也因为这个原因必须在方法返回之前为 out 参数赋值(只有地址没有值的参数是不能被 net接受的)

  原则五 属性不是变量 不能作为 out 参数传递

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

  

  class MyClass public void MyMethod(int i) i = ; public void MyMethod(out int i) i = ; 而以下重载声明是无效的 class MyClass public void MyMethod(out int i) i = ; public void MyMethod(ref int i) i = ;

  有关传递数组的信息 请参见使用 ref 和 out 传递数组

  NO ref

  ref仅仅是一个地址!!!

  原则一 当一个方法(函数)在使用ref作为参数时 在方法中(函数)对ref参数所做的任何更改都将反映在该变量中

  原则二 调用方法时 在方法中对参数所做的任何更改都将反映在该变量中

  原则三 若要使用 ref 参数 必须将参数作为 ref 参数显式传递到方法 ref 参数的值可以被传递到 ref 参数

  原则四 ref参数传递的变量必须初始化 因为ref参数在进入方法(函数)时后还是它自己 它这个地址指向的还是原来的值 也因为这个原因ref参数也可以在使用它的方法内部不操作

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

  

  class MyClass public void MyMethod(int i) i = ; public void MyMethod(ref int i) i = ; 但以下重载声明是无效的 class MyClass public void MyMethod(out int i) i = ; public void MyMethod(ref int i) i = ;

  有关传递数组的信息 请参见使用 ref 和 out 传递数组

  示例

  

  public static string TestOut(out string i) i = out b ; return return value ; public static void TestRef(ref string i) //改变参数i = ref b ; public static void TestNoRef(string refi) // 不用改变任何东西 这个太明显了refi = on c ; public Form () InitializeComponent(); private void button _Click(object sender EventArgs e) string outi; //不需要初始化MessageBox Show(TestOut(out outi)); //返回值//输出 return value ; MessageBox Show(outi); //调用后的out参数//输出 out b ; string refi = a ; // 必须初始化TestRef(ref refi); // 调用参数MessageBox Show(refi); //输出 ref b ; TestNoRef(refi); //不使用refMessageBox Show(refi); //输出 ref b ;

cha138/Article/program/net/201311/12015

相关参考

知识大全 .net程序员的盲点(二):两个属性引起的歧义

  两个属性引起的歧异property和attribute的区别这虽然没有一个馒头引发的血案那么严重但是也足以成为net程序员的技术盲点之二  对于property和attribute这两个名词都叫属

知识大全 c#学习体会:使用 ref 和 out 传递数组

  c#学习体会:使用ref和out传递数组(downmoon)希望与大家分享与所有的out参数一样在使用数组类型的out参数前必须先为其赋值即必须由接受方为其赋值例如public stat

知识大全 全面分析C#方法中的ref和out

全面分析C#方法中的ref和out  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  ref&nbs

股票公式量先行副图股票指标公式

股票公式量先行副图股票指标公式:飞弧原码:p=13BIAS1:=ma(sum(vol,3),p);JJ:=(BIAS1+ref(BIAS1,1)+ref(BIAS1,2)+ref(BIAS1,3))/

知识大全 重定向输出流实现程序日志

  System类中的out成员变量是java的标准输出流通常用它来输出调试信息out成员变量被定义为final类型无法直接重新复制但是可以通过setOut()方法来设置新的输出流本例通过该方法实现了

知识大全 认识在.net开发中几个重要的误区

  net如今已经很流行成为赶时髦的程序员的首选但是大量刚刚接触net的程序员的确存在一定的认识误区这里先介绍一部分  一net程序再运行一次就会更快  许多人对此的解释是net程序第一次运行时会被编

知识大全 在.net开发中几个重要的认识误区

  net如今已经很流行成为赶时髦的程序员的首选但是大量刚刚接触net的程序员的确存在一定的认识误区这里先介绍一部分  一net程序再运行一次就会更快  许多人对此的解释是net程序第一次运行时会被编

知识大全 c#中通过值和引用传递参数

  在C#中既可以通过值也可以通过引用传递参数通过引用传递参数允许函数成员(方法属性索引器运算符和构造函数)更改参数的值并保持该更改若要通过引用传递参数请使用ref或out关键字为简单起见本主题的示例

知识大全 ASP.Net中程序构架与程序代码的分离

ASP.Net中程序构架与程序代码的分离  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一年前当

知识大全 使用OracleODP.NET11g的.NET程序发布方法

使用OracleODP.NET11g的.NET程序发布方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一