`

C#:ref和out的联系及区别

    博客分类:
  • C#
 
阅读更多
一:ref 关键字使参数按引用传递。
其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。
也即是说,在方法中对参数的设置和改变将会直接影响函数调用之处(代码①及②)。无论是函数的定义还是调用时均不可忽略关键字ref.
可以对比代码:
代码①:
复制代码
 1 class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             Program pg = new Program();
 6             int x = 10;
 7             int y = 20;
 8             pg.GetValue(ref x, ref  y);
 9             Console.WriteLine("x={0},y={1}", x, y);
10 
11             Console.ReadLine();
12           
13         }
14 
15         public void GetValue(ref int x, ref int y)
16         {
17             x = 521;
18             y = 520;
19         }
20     }
复制代码

 

运行结果为 

代码②

复制代码
 1 class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             Program pg = new Program();
 6             int x = 10;
 7             int y = 20;
 8             pg.GetValue(ref x, ref  y);
 9             Console.WriteLine("x={0},y={1}", x, y);
10 
11             Console.ReadLine();
12           
13         }
14 
15         public void GetValue(ref int x, ref int y)
16         {
17             x = 1000;
18             y = 1;
19         }
20     }
复制代码

 

由代码① 和②的运行结果可以看出,在方法中对参数所做的任何更改都将反映在该变量中,而在main函数中对参数的赋值却没有起到作用,这是不是说明不需要进行初始化呢?来看第二点

二:ref定义的参数在使用前必须初始化,无论在函数定义时候参数有没有赋予初值。这条正好区分out指定的参数可以不在调用函数的时候进行初始化。
来看代码③ 以及其运行结果:
复制代码
 1  class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             Program pg = new Program();
 6             int x;
 7             int y;        //此处x,y没有进行初始化,则编译不通过。
 8             pg.GetValue(ref x, ref  y);
 9             Console.WriteLine("x={0},y={1}", x, y);
10 
11             Console.ReadLine();
12           
13         }
14 
15         public void GetValue(ref int x, ref int y)
16         {
17             x = 1000;
18             y = 1;
19         }    
20     }
复制代码

 

出现的错误为:使用了未赋值的局部变量“x”,“y”。故可以说明ref指定的参数无论在函数定义的时候有没有赋予初值,在使用的时候必须初始化。

三 :对out来说,第一条同样适用。将代码①以及②中的ref全部修改成out,则可与使用ref得到同样的结果。
 
四:out指定的参数必须在函数定义的时候就赋初值。否则则出现错误。对比ref指定的参数则可以不在函数内部进行赋初值,在函数调用时候再赋初值也可以。
代码④:
复制代码
 1 class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             Program pg = new Program();
 6             int x=10;
 7             int y=233;
 8             pg.Swap(out x, out y);
 9             Console.WriteLine("x={0},y={1}", x, y);
10 
11             Console.ReadLine();
12           
13         }
14 
15         public void Swap(out int a,out  int b)
16         {
17             
18             int temp = a;   //a,b在函数内部没有赋初值,则出现错误。
19             a = b;
20             b = temp;
21         }     
22     
23     }
复制代码

 

出现错误:使用了未赋值的out参数“a”,"b"
则在swap函数定义时候给a,b赋上初值则运行正确。
 
总结以上四条得到ref和out使用时的区别是:
①:ref指定的参数在函数调用时候必须初始化,不能为空的引用。而out指定的参数在函数调用时候可以不初始化;
②:out指定的参数在进入函数时会清空自己,必须在函数内部赋初值。而ref指定的参数不需要。
分享到:
评论

相关推荐

    C_基础:ref和out的区别.txt

    ### C# 基础:ref与out的区别 在C#编程语言中,`ref` 和 `out` 是两个非常重要的关键字,它们主要用于传递参数,特别是在函数调用时需要修改方法外部变量的情况下。掌握 `ref` 和 `out` 的正确使用方式对于编写高...

    c#中ref和out用法

    在C#编程语言中,`ref`和`out`是两个关键字,它们都用于方法参数传递,但有各自独特的用途和规则。理解并熟练运用`ref`和`out`是提高C#编程效率的关键。 首先,`ref`关键字用于当需要在方法内部修改传入的参数值,...

    C# ref和out的区别

    ### C#中`ref`与`out`的关键区别 在C#编程语言中,方法的参数传递机制提供了多种方式来处理方法内部对外部变量的访问和修改。这其中包括了通过值(by value)和通过引用(by reference)两种基本模式。通过引用传递...

    C_中out和ref的区别

    在C#编程语言中,`out`和`ref`关键字被用于传递参数,尤其是在方法调用时,它们允许方法修改其外部作用域内的变量。这两个关键字虽然在功能上有些相似,但其实现机制和使用场景有着本质的区别。下面将详细探讨`out`...

    C#中ref,out和params有什么区别

    ### C#中的`ref`、`out`和`params`的区别 #### 一、概述 在C#编程语言中,`ref`、`out`和`params`是三种不同的参数修饰符,它们分别用于控制方法如何处理传入的参数。这些关键字在不同的场景下提供了非常有用的...

    C#中关键字ref与out的区别

    C#中关键字ref与out的区别 C#中关键字ref与out的区别是非常重要的知识点之一。这些关键字可以使参数按照引用来传递,而不是传递值的拷贝。通常情况下,我们向方法中传递的是值,方法获得的是这些值的一个拷贝,然后...

    c#学习体会使用 ref 和 out 传递数组

    ### C#学习体会:使用`ref`和`out`传递数组 在C#语言中,`ref`和`out`是两个非常重要的关键字,它们主要用于处理函数参数的传递方式。通常情况下,在C#中调用方法时,参数是以值传递的方式进行的,也就是说,方法内...

    in.ref.out C#传值调用与引用调用

    通过上面的例子和解释,我们可以看到 `in`、`ref` 和 `out` 关键字在C#中的不同用途: - `in` 用于值传递,方法内部无法修改参数。 - `ref` 用于引用传递,可以在方法内部修改并更新原始变量。 - `out` 也是用于引用...

    C#中ref与out语法的使用

    在C#编程语言中,`ref`和`out`关键字是两种特殊的参数传递方式,它们允许函数修改调用者提供的变量的值。虽然这两种关键字在功能上有些相似,但它们的使用场景和语法规则有所不同。本文将深入探讨`ref`和`out`的用法...

    C#中out与ref的区别实例解析

    本文实例讲述了C#中Out与Ref的区别,可以加深C#程序设计人员对Out和Ref用法的理解,具体分析如下: 一、区别分析: Out和Ref作为参数传递到方法体中,所传递的都是引用地址,两者在操作上本身没有区别。 但Out传递到...

    ref和out传值

    在C#编程语言中,`ref` 和 `out` 关键字用于参数传递,它们都是为了改变函数调用时实参的值。然而,两者在使用上存在一些关键区别,理解这些差异对于编写高效且正确的代码至关重要。 1. **传值方式**: 在C#中,...

    C#中ref和out的区别浅析

    因此,当一个方法需要返回多个值的时候,就需要用到ref和out,那么这两个方法区别在哪儿呢? MSDN:  ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该...

    ref和out的作用(txt)

    在C#编程语言中,`ref`和`out`是两种用于方法参数的关键字,它们允许方法直接修改传递给它的参数值。这两种关键字的主要区别在于调用方法时参数的初始化以及参数的传递方式。 #### `ref`关键字 `ref`关键字使得...

    ref out 的区别

    **`ref` 和 `out` 的联系和区别** 1. **共同点**:两者都是引用传递,都能修改原始变量的值。 2. **区别**: - `ref` 要求在调用方法前必须初始化,而 `out` 不需要。 - `out` 主要用于返回多个值,而 `ref` 更...

    (搜集整理的)C_中ref和out用法

    在C#编程中,`ref`和`out`关键字是用来处理方法参数的特殊方式,它们允许函数修改调用者提供的变量。虽然这两种关键字在某些方面很相似,但也存在关键的区别。 `ref`关键字: 1. `ref`参数要求在传递到方法之前必须...

    out和ref的区别

    在C#编程语言中,`out`和`ref`都是用于方法参数传递的关键字,它们允许函数修改调用者提供的变量值。虽然这两个关键字看似相似,但它们在使用上有着本质的区别,理解这些区别对于编写高效、清晰的代码至关重要。 ...

    C#中的参数传递 - ref, out比较

    本文将深入解析C#中涉及的几种关键参数传递机制:值类型的基本传递、`ref`关键字以及`out`关键字,并通过具体示例来说明这些传递方式的区别及应用场景。 ### 值类型的参数传递 在C#中,当我们将一个值类型(如基本...

    c#基础系列之ref和out的深入理解

    在C#编程语言中,`ref`和`out`关键字是用来处理方法参数的引用传递,它们都是为了在方法之间共享变量的值。虽然两者在某些方面相似,但它们的使用场景和规则有所不同。 首先,我们要明确一点,C#中参数传递有两种...

    Ref和Out参数的例子

    在.NET编程中,`Ref`和`Out`参数是C#、VB.NET等语言中用于方法调用的重要特性,它们允许方法修改传递给它的变量值。这两种参数修饰符提供了与普通参数不同的行为,有助于处理复杂的数据传递场景。下面将详细探讨`Ref...

    ref和out的区别

    在C#编程语言中,`ref`和`out`关键字都是用于传递参数的引用,这意味着它们都允许函数或方法直接修改调用者提供的变量。尽管它们具有相似性,但存在关键的区别,这些区别体现在参数的初始化、使用上下文以及如何...

Global site tag (gtag.js) - Google Analytics