码迷,mamicode.com
首页 > 其他好文 > 详细

out和ref的用法和区别

时间:2015-06-09 21:29:09      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:

out和ref的用法和区别

函数参数默认是值传递,也就是“复制一份”

看个栗子:

static void Main(string[] args)
        {
            int age = 10;
            IncAge(age);
            Console.WriteLine(age);//结果是10,因为函数参数默认是值传递,IncAge()对外面这个age没有影响
            Console.ReadKey();
        }
        static void IncAge(int age)
        {
            age++;
        }

ref(reference:引用)

ref必须先初始化,因为是引用传递,所以必须先“有”,才能引用。

引用传递:我理解的就是从别人家水渠引来一池水,如果你家水池污染了,那别人家的也会被污染,一处遭殃两处哭丧,一脉相连。引用传递在内存里就是引用了age的内存地址,当你给age(假如地址是0x001)赋值12,那么另一个指向地址0x001的age的值也会改变。

看个栗子:

static void Main(string[] args)
        {
            int age = 10;//ref,必须初始化
            IncAge(ref age);
            Console.WriteLine(age);//结果是11,因为ref是引用传递,经IncAge()改变后,Main方法中的age也会受到影响
            Console.ReadKey();
        }
        static void IncAge(ref int age)
        {
            age++;
        }

什么时候使用:内部对外部的值进行改变(当然也可以不改变)。

看个栗子:

static void Main(string[] args)
        {
            int i1 = 10;
            int i2 = 20;
            Swap(ref i1,ref i2);
            Console.WriteLine("i1={0},i2={1}",i1,i2);//结果是i1=20,i2=10
            Console.ReadKey();
        }
        static void Swap(ref int i1, ref int i2)
        {
            int temp = i1;
            i1 = i2;
            i2 = temp;
        }

 

out(我很排外,别给我初始值,给了也不要)

out是内部对外部变量赋值,所以不需要初始化,而且初始化也没用。

举个栗子:

 static void Main(string[] args)
        {
            int age;//可以初始化,但初始化也没用,out不要
            IncAge(out age);
            Console.WriteLine(age);//结果是12
            Console.ReadKey();
        }
        static void IncAge(out int age)
        {
            age = 11;//out必须先赋值
            age++;
        }

什么时候使用:内部为外部赋值,out一般用在函数有多个返回值的时候。

举个TryParse()的栗子:

 static void Main(string[] args)
        {
            string str = 123;
            int i;
            if (int.TryParse(str, out i))//out返回两个值,一是ture,转换成功,二是false,转换失败
            {
                Console.WriteLine("转换成功:{0}",i);//结果:123
            }
            else
            {
                Console.WriteLine("数据错误:{0}",i);//结果:数据错误:0,转换失败,i就是0
            }
            Console.ReadKey();
        }

 

out和ref的用法和区别

标签:

原文地址:http://www.cnblogs.com/sean100/p/4564381.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!