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

Posted

篇首语:知之者不如好之者,好之者不如乐之者。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 c#中通过值和引用传递参数相关的知识,希望对你有一定的参考价值。

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

  本主题包括下列章节

传递值类型参数 传递引用类型参数

  它还包括以下示例

示例 演示 是否使用 ref 或 out 通过值传递值类型 否 通过引用传递值类型 是 交换值类型(两个整数) 是 通过值传递引用类型 否 通过引用传递引用类型 是 交换引用类型(两个字符串) 是

传递值类型参数

  值类型变量直接包含其数据 这与引用类型变量不同 后者包含对其数据的引用 因此 向方法传递值类型变量意味着向方法传递变量的一个副本 方法内发生的对参数的更改对该变量中存储的原始数据无任何影响 如果希望所调用的方法更改参数值 必须使用 ref 或 out 关键字通过引用传递该参数 为了简单起见 以下示例使用 ref

示例 通过值传递值类型

  下面的示例演示通过值传递值类型参数 通过值将变量 myInt 传递给方法 SquareIt 方法内发生的任何更改对变量的原始值无任何影响

  // PassingParams cs using System;class PassingValByVal     static void SquareIt(int x)    // The parameter x is passed by value     // Changes to x will not affect the original value of myInt              x *= x;        Console WriteLine( The value inside the method:   x);        public static void Main()             int myInt =  ;        Console WriteLine( The value before calling the method:             myInt);        SquareIt(myInt);   // Passing myInt by value         Console WriteLine( The value after calling the method:             myInt);    

输出

  The value before calling the method: The value inside the method: The value after calling the method:

代码讨论

  变量 myInt 为值类型 包含其数据(值 ) 当调用 SquareIt 时 myInt 的内容被复制到参数 x 中 在方法内将该参数求平方 但在 Main 中 myInt 的值在调用 SquareIt 方法之前和之后是相同的 实际上 方法内发生的更改只影响局部变量 x

示例 通过引用传递值类型

  下面的示例除使用 ref 关键字传递参数以外 其余与 示例 相同 参数的值在调用方法后发生更改

  // PassingParams cs using System;class PassingValByRef     static void SquareIt(ref int x)    // The parameter x is passed by reference     // Changes to x will affect the original value of myInt              x *= x;        Console WriteLine( The value inside the method:   x);        public static void Main()             int myInt =  ;        Console WriteLine( The value before calling the method:             myInt);        SquareIt(ref myInt);   // Passing myInt by reference         Console WriteLine( The value after calling the method:             myInt);    

输出

  The value before calling the method: The value inside the method: The value after calling the method:

代码讨论

  本示例中 传递的不是 myInt 的值 而是对 myInt 的引用 参数 x 不是 int 类型 它是对 int 的引用(本例中为对 myInt 的引用) 因此 当在方法内对 x 求平方时 实际被求平方的是 x 所引用的项 myInt

示例 交换值类型

  更改所传递参数的值的常见示例是 Swap 方法 在该方法中传递 x 和 y 两个变量 然后使方法交换它们的内容 必须通过引用向 Swap 方法传递参数 否则 方法内所处理的将是参数的本地副本 以下是使用引用参数的 Swap 方法的示例

  static void SwapByRef(ref int x  ref int y)     int temp = x;    x = y;    y = temp;

  调用该方法时 请在调用中使用 ref 关键字 如下所示

  SwapByRef (ref i ref j);

  传递引用类型参数

  引用类型的变量不直接包含其数据 它包含的是对其数据的引用 当通过值传递引用类型的参数时 有可能更改引用所指向的数据 如某类成员的值 但是无法更改引用本身的值 也就是说 不能使用相同的引用为新类分配内存并使之在块外保持 若要这样做 请使用 ref(或 out)关键字传递参数 为了简单起见 以下示例使用 ref

示例 通过值传递引用类型

  下面的示例演示通过值向 Change 方法传递引用类型的参数 myArray 由于该参数是对 myArray 的引用 所以有可能更改数组元素的值 但是 试图将参数重新分配到不同的内存位置时 该操作仅在方法内有效 并不影响原始变量 myArray

  // PassingParams cs // Passing an array to a method without the ref keyword // Compare the results to those of Example  using System;class PassingRefByVal     static void Change(int[] arr)          arr[ ]= ;   // This change affects the original element       arr = new int[ ]          ;   // This change is local       Console WriteLine( Inside the method  the first element is:   arr[ ]);         public static void Main()           int[] myArray =  ;      Console WriteLine( Inside Main  before calling the method  the first element is:   myArray [ ]);      Change(myArray);      Console WriteLine( Inside Main  after calling the method  the first element is:   myArray [ ]);   

输出

  Inside Main before calling the method the first element is: Inside the method the first element is: Inside Main after calling the method the first element is:

代码讨论

  在上个示例中 数组 myArray 为引用类型 在未使用 ref 参数的情况下传递给方法 在此情况下 将向方法传递指向 myArray 的引用的一个副本 输出显示方法有可能更改数组元素的内容(从 改为 ) 但是 在 Change 方法内使用 new 运算符分配新的内存部分 将使变量 arr 引用新的数组 因此 这之后的任何更改都不会影响原始数组 myArray(它是在 Main 内创建的) 实际上 本示例中创建了两个数组 一个在 Main 内 一个在 Change 方法内

示例 通过引用传递引用类型

  本示例除在方法头和调用中使用 ref 关键字以外 其余与 示例 相同 方法内发生的任何更改都会影响调用程序中的原始变量

  // PassingParams cs // Passing an array to a method with the ref keyword // Compare the results to those of Example  using System;class PassingRefByRef     static void Change(ref int[] arr)          // Both of the following changes will affect the original variables:      arr[ ]= ;      arr = new int[ ]          ;      Console WriteLine( Inside the method  the first element is:   arr[ ]);         public static void Main()           int[] myArray =  ;      Console WriteLine( Inside Main  before calling the method  the first element is:   myArray [ ]);      Change(ref myArray);      Console WriteLine( Inside Main  after calling the method  the first element is:   myArray [ ]);   

输出

  Inside Main before calling the method the first element is: Inside the method the first element is: Inside Main after calling the method the first element is:

代码讨论

  方法内发生的所有更改都影响 Main 中的原始数组 实际上 使用 new 运算符对原始数组进行了重新分配 因此 调用 Change 方法后 对 myArray 的任何引用都将指向 Change 方法中创建的五个元素的数组

示例 交换两个字符串

  交换字符串是通过引用传递引用类型参数的很好的示例 本示例中 str 和 str 两个字符串在 Main 中初始化 并作为由 ref 关键字修饰的参数传递给 SwapStrings 方法 这两个字符串在该方法内以及 Main 内均进行交换

  // PassingParams csusing System;class SwappinStrings     static void SwapStrings(ref string s  ref string s )    // The string parameter x is passed by reference     // Any changes on parameters will affect the original variables              string temp = s ;        s  = s ;        s  = temp;        Console WriteLine( Inside the method:     s  s );        public static void Main()             string str  =  John ;        string str  =  Smith ;        Console WriteLine( Inside Main  before swapping:                str  str );        SwapStrings(ref str  ref str );   // Passing strings by reference        Console WriteLine( Inside Main  after swapping:                str  str );    

输出

  Inside Main before swapping: John SmithInside the method: Smith JohnInside Main after swapping: Smith John

代码讨论

cha138/Article/program/net/201311/12635

相关参考

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

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

知识大全 c#中的params关键字的应用

  要接受未知数目的参数可以使用关键字params该关键字用于参数列表中声明参数列表最后面的值params关键字与数组一起使用  当值被传递给方法时编译器首先查看是否有匹配的方法如果有则调用该方法如果

知识大全 c#中通过设置钩子监视鼠标移动

这个问题来自论坛提问咨询如何通过设置钩子监视鼠标的移动C#的大致代码如下      usingSystem;usingSystemWindowsForms;usingSystemRuntimeInte

知识大全 Asp.net多层架构中的变量引用与传递

Asp.net多层架构中的变量引用与传递  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  的多层架

知识大全 C#中通过读取配置文件动态创建泛型对象

C#中通过读取配置文件动态创建泛型对象  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  背景  我

知识大全 注意C++和C#引用的区别

注意C++和C#引用的区别  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  C#用多了最近又回到C

知识大全 C#传值调用与引用调用

C#传值调用与引用调用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  usingSystem; 

知识大全 C#中比较常见的类以及对应的引用

C#中比较常见的类以及对应的引用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Regex引用u

知识大全 Jsp传递中文参数详解

Jsp传递中文参数详解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  目前在jsp页面中传递中文

知识大全 访问WebService传递复杂参数

访问WebService传递复杂参数  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  数据类型(A