ref与out

 我们知道,将值类型作为方法参数的时候,只是复制了一个而已,并不能改变其原来的值,方法执行完,参数的周期就算完了
,就会消失了,如果想改变原来的值怎么办的,就比如把引用类型作为参数一样,可以改变原来的值,那是因为它传递过去的
 是一个引用,一个指向同一个对象的引用,所有对象的值会改变,如果想让值类型在传递的过程中,也可以这样,改变原来的值,那么就就必须把值类型当做引用类型来传递,也就是在方法中加入ref关键字来修饰参数,先来看看下面的例子

 

View Code
  protected void Page_Load(object sender, EventArgs e)
      {
        int num = 200;
        GetValue(num);
        Label1.Text = num.ToString();
      }
        protected void GetValue(ref int num1)
       {
        num1 = 100;
       }

 如果就是这样的话,上面我们说到只是复制了num作为参数使用,但是原来的num并没有因此而改变,所以在此输入num的值还是以前的的值200,不是100,但是加上ref之后就不一样了

 

View Code
protected void Page_Load(object sender, EventArgs e)
    {
    int num = 200;
    GetValue(ref num);
    Label1.Text = num.ToString();
    }
    protected void GetValue(ref int num1)
    {
    num1 = 100;
    }

这样的值就改变num的值,就是100了,总得来说就是把值类型转换成引用类型作为参数传递了,可以改变原来的值
 还有另外一个修饰符out,这个主要是用来输出的,确切的说ref和out传递的都是地址,但是唯一的区别就是ref重点的将值传入到方法内,而out则注重于输出,不用初始化,看看下面的例子就明白了

 

View Code
using System;
    namespace ParameterOutSample3_4
    {
        class AddClass
        {
        public static void Add(int x, int y, out int z)
        {
            z = x + y;
        }
        }
    class MyClass
        {
        public static void Main()
        {
            int a = 13, b = 19, c; //c未初始化
        AddClass.Add(a, b, out c);
            Console.WriteLine("a+b={0}", c);
        }
        }
    }

有时候使用out和ref可以实现相同的功效,最大的区别就在于out重在输出,不把具体的值传递到方法内,在方法外,不用赋值,而ref就重在输入,需要在方法外初始化!

简答总结:

    ref与out实现的结果一样,都可以改变原来的值,只是ref需要在方法外赋值,而out不需要在方法外赋值

   另外有个简单的用法

 if (!int.TryParse(Request.Params["id"as stringout this.Id))
            {
           }

可以直接赋值判断

posted @ 2012-02-16 15:37  双魂人生  阅读(237)  评论(0编辑  收藏  举报