码迷,mamicode.com
首页 > Windows程序 > 详细

C# 中 ref,out, params 解析

时间:2015-04-02 20:26:26      阅读:273      评论:0      收藏:0      [点我收藏+]

标签:

方法的参数传递有四种类型:传值(by value),传址(by reference),输出参数(by output ),数组参数(by array)。

传值参数无须额外的修饰符,传址参数需要修饰符ref,输出参数需要修饰符out,数组参数需要修饰符params。

例1:

技术分享
public static void method(string x,ref string y,out string z)

{

x="我是传值类型";

y="我是传址类型,传入的参数必须先被初始化";

z="我是输出参数,必须在方法中对我完成初始化";

}

static void Main()

{

string a="传值类型",b="传址类型",c;

Console.WriteLine("before method call:a={0},b={1},c=未赋值",a,b);

method(a,ref b,out c);

Console.WriteLine("after method call:a={0},b={1},c={3}",a,b,c);

}
View Code

输出结果如下:

技术分享

可以看到a的值始终不变,b和c的值改变了。

例2:

技术分享
public static void bubble(int x,int y)
        {
            int temp = x;
            x = y;
            y = temp;
        }
        static void Main()
        {
            int a = 5, b = 6;
            bubble(a,b);
            Console.WriteLine("value is :a={0},b={1}",a,b);
        }
View Code

输出结果:

技术分享

技术分享
 public static void bubble(ref int x,ref int y)
        {
            int temp = x;
            x = y;
            y = temp;
        }
        static void Main()
        {
            int a = 5, b = 6;
            bubble(ref a,ref b);
            Console.WriteLine("value is :a={0},b={1}",a,b);
        }
View Code

输出结果:

技术分享

 

用冒泡算法来看,很明显的,使用了ref关键字的函数调用以后,a的b的值变化了。而没有使用ref的没有变化。

例3:

技术分享
        static string outvalue(out string name)
        {
            string name1 = "蜡笔小新";
            name = name1;
            string name2 = "小色鬼";
            return name2;
        }
        static void Main()
        {
            string name = "小新";
            Console.WriteLine("before call:{0}", name);
            string result = outvalue(out name);
            Console.WriteLine("after call:{0}", name);
            Console.WriteLine("finally return:{0}", result);
        }
View Code

输出结果:

技术分享

例4:

 

技术分享
static void pararry(params object[] list)
        {
            for (int i = 0; i < list.Length; i++)
            {
                Console.WriteLine(list[i]);
            }
        }
        static void array(object[] list)
        {
            foreach (object _list in list)
            {
                Console.WriteLine(_list);
            }
        }
        static void Main()
        {
            object[] arr = new object[] { 1, "a", "b" };
            pararry("a", "b", "c", "...", "n");//传递多个参数,多个object数组
            pararry(arr);//将数组arr作为值参数传递
            array(arr);//传递一个参数,这个参数是一个数组
        }     
View Code

 

输出结果:

技术分享

注意:paras类型参数主要用于在对数组长度未知(可变)的情况下进行函数声明。在方法声明中只允许一个paras关键字,并且该关键字只能为最后一个。

 总结:

通过引用传递参数允许函数成员更改参数的值,并保持该更改。

ref和out这两个关键字的区别是:

1、使用ref型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。

2、使用ref和out时,在方法的参数和执行方法时,都要加Ref或Out关键字。以满足匹配。

3、out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。

ref、out与params,ref是引用方法内的参数影响结果;out是引用方法中参数返回结果到主方法;而params是将可变同类参数(即数组)传入参数。使用中ref用于需要调用引用方法内的数据的。out用于利用引用方法对主方法进行操作,而prarams用于参数长度未知的情况。

 

 

转自 http://blog.163.com/tun_shi@126/blog/static/801797122010815113152548/

 

C# 中 ref,out, params 解析

标签:

原文地址:http://www.cnblogs.com/leesymbol/p/4387721.html

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