方法参数ref,out的问题!

转载 2006年06月19日 11:21:00

对于值型变量作为方法参数时,可以有三种情况:
1.没有ref和out参数  (直接传值,不能改变实参)
2.使用ref参数       (引用传递,输入,可以改变实参)
3.使用out参数       (引用传递,输出,可以改变实参)

4.ref和out的区别在于一个需要初始化,另一个不需要...

例子:

例子(一)

using System;
using System.Collections.Generic;
using System.Text;

namespace TestRef
{
    class Program
    {
        static void TestRef(ref int i){i+=5;}
        static void Test(int i){i+=5;}
        static void Main(string[] args)
        {
            int i1, i2;
            i1 = 10;
            i2 = 10;
            TestRef(ref i1);//
            Test(i2);//
            Console.WriteLine("i1={0}, i2={1}", i1, i2);
            Console.ReadLine();
        }
    }
}
结果:i1=15, i2=10
分析
如果不用ref那么方法Test对实参i2的改变(i2=i2+5)到那里去了?合理的解释是,传的是一个考贝.


例子(二)

为了证明其传的是一个复制本,那么设计一个新测试如下:
using System;
using System.Collections.Generic;
using System.Text;

namespace TestRef
{
    class Program
    {
        static void TestRef(ref int i)
        {
            i += 5;
        }
        static void Test(int i)
        {
            Console.WriteLine("Test中的实参为: {0}", i);
            i += 5;
            Console.WriteLine("Test中的实参为修改后为: {0}", i);
        }
        static void Main(string[] args)
        {
            int i1, i2;
            i1 = 10;
            i2 = 10;
            TestRef(ref i1);//
            Test(i2);//
            Console.WriteLine("i1={0}, i2={1}", i1, i2);
            Console.ReadLine();
        }
    }
}
结果:
Test中的实参为: 10
Test中的实参为修改后为: 15
i1=15, i2=10

这充分说明了,再传递实参(区别于函数定义时称为"形式参数"的称法)时是传递实参的一个复制本这个复制本与实参值相等,但处于内存中不同的位置,换言之如果单独对其中任何一个进行修改,那么这种修改的影响只会对其本身产生影响而与其它任何内在位置的其自身的复制本无关!

 

c#方法参数ref和out区别

c#方法参数ref和out区别 params 关键字可以指定采用数目可变的参数的 方法参数。 可以发送参数声明中所指定类型的逗号分隔的参数列表或指定类型的参数数组。 还可以不发送参数。 在方法声明中的...
  • l1158513573
  • l1158513573
  • 2015年05月07日 17:03
  • 465

C#中方法参数 ref 与 out 的区别

方法中参数的类型有三种 in型参数 in型参数通过值传递的方式将数值传入方法中。即我们在Java中常见的方法 ref型参数 该种类型的参数传递变量地址给方法(引用传递),传递前变量必须初始化。 ...
  • jl1134069094
  • jl1134069094
  • 2016年01月13日 17:25
  • 1026

利用反射调用方法时,处理ref,out参数需要注意的问题

项目中如下的泛型方法,因为要在运行时,动态指定类型参数,所以要利用反射来实现。 public static TR Deserialize(byte[] source, ref int offset)...
  • shihuaicheng
  • shihuaicheng
  • 2015年03月18日 12:31
  • 956

方法参数修饰符ref和out的区别

out和ref 1)out和ref传变量的地址(引用地址),形参改变,实参也改变。因为他们都是引用一个地址的; 2)带ref和out修饰的参数只能传递变量不能传递常量. 3)out和ref的区别...
  • kikibingo
  • kikibingo
  • 2014年05月11日 22:04
  • 1262

方法参数:ref out params

1.ref 和 out 的区别ref定义:ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方...
  • ajq1989
  • ajq1989
  • 2010年11月09日 12:34
  • 308

方法参数(params,ref,out)

如果在为方法声明参数时未使用ref 或 out,则该参数可以具有关联的值。可以在方法中更改该值,但当控制传递回调用过程时,不会保留更改的值。通过使用方法参数关键字,可以更改这种行为。 Normal...
  • lai123wei
  • lai123wei
  • 2008年12月23日 13:56
  • 387

方法参数(ref out params)

值参数传入函数不改变值,ref  修饰的参数会改变大小。 例如: int m =5,n=6; function(ref m,ref n);(结果是变成了1,变成2) public void f...
  • whw6263989
  • whw6263989
  • 2012年07月13日 17:38
  • 162

C#的out参数和ref参数

刚学C#的时候看过out参数和ref参数的用法,但是一直没有根据实际项目做过
  • u010771437
  • u010771437
  • 2014年11月12日 19:22
  • 633

C# ref 和 out ,params关键字的用法

C# ref,out,params 的用法。
  • mydad353193052
  • mydad353193052
  • 2015年08月29日 22:25
  • 814

ref与out之间的区别整理

ref和out都是C#中的关键字,所实现的功能也差不多,都是指定一个参数按照引用传递。 对于编译后的程序而言,它们之间没有任何区别,也就是说它们只有语法区别。 总结起来,他们有如下语法区别:  ...
  • xiaoning8201
  • xiaoning8201
  • 2011年10月21日 10:39
  • 8551
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:方法参数ref,out的问题!
举报原因:
原因补充:

(最多只允许输入30个字)