博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

C#中参数前缀ref、out的使用

Posted on 2012-07-27 13:52  moss_tan_jun  阅读(830)  评论(0编辑  收藏  举报

一、使用ref、out前缀与不使用前缀的区别

     int intParam = 0;           

     object objParam = null;   

     public void method(int intParam,object objParam)     //intParam是值类型形参, objParam是引用类型形参

    {

             //do  something.....

     }

    public void Main()

    {

          method(intParam,objParam) ; //intParam是值类型实参, objParam是引用类型实参

    }

    

     不使用前缀时,向方法传递一个实参时,对应的形参会使用实参的一个副本来初始化。对于值类型的实参副本等于该值本身,而对于引用类型的实参副本则等于引用变量的值。 如果为一个形参附加了ref关键字,该参数就会成为实参的一个别名,而不再是实参的一个副本。

二、ref、out的区别

     使用ref的参数必须先赋值,out的可以不初始化参数。其余的作用相同。

三、ref应用于引用类型的参数

     对于引用类型的参数,加ref前缀,传递的是原引用变量的引用,如果你在方法体内对形参重新赋值,那么将影响到实参,即形参和实参的引用是同一地址;不加ref前缀,传递的是原引用变量的副本,即使你在方法体内对形参重新赋值,不影响实参,即形参和实参的引用是不同的。

    示例:

复制代码
using System;
using System.Collections.Generic;
using System.Text;

namespace Parameters
{
    class WrappedInt
    {
        public int number;

    }
    class Pass
    {
        public static void Value(ref int param)
        {
            param = 10;
        }
        //使用引用类型的参数,方法体内不对参数的引用做任何修改
        public static void Reference(WrappedInt param)
        {
            param.number = 50;
        }
        //使用加了ref修饰符的引用类型的参数,方法体内对参数的引用做了修改
        //由于使用了ref修饰符,所以将影响到实参。
        public static void refReference(ref WrappedInt param)
        {
            WrappedInt wi = new WrappedInt();
            wi.number = 100;
            param = wi;
        }
        //使用未加ref修饰符的引用类型的参数,方法体内对参数的引用做了修改
        public static void NorefReference(WrappedInt param)
        {
            WrappedInt wi = new WrappedInt();
            wi.number = 100;
            param = wi;
        }
    }
    class Program
    {
        static void DoWork()
        {
            WrappedInt reParam = new WrappedInt();

            Console.WriteLine(reParam.number);
            Pass.Reference(reParam);       //使用引用类型变量,实参和方法体内的形参引用的是同一个地址。
            Console.WriteLine(reParam.number);
             Pass.NorefReference(reParam); //未使用ref修饰符,虽然在方法体内修改了形参的引用,但不影响实参reParam
            Console.WriteLine(reParam.number);
            Pass.refReference(ref reParam); //由于使用了ref修饰符,在方法体内修改了形参的引用将影响到实参reParam。
            Console.WriteLine(reParam.number);
        }

        static void Main(string[] args)
        {
            try
            {
                DoWork();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}
复制代码