zoukankan      html  css  js  c++  java
  • C# 中 ref,out, params 解析

    方法的参数传递有四种类型:传值(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/

  • 相关阅读:
    再次或多次格式化导致namenode的ClusterID和datanode的ClusterID之间不一致的问题解决办法
    Linux安装aria2
    POJ 3335 Rotating Scoreboard 半平面交
    hdu 1540 Tunnel Warfare 线段树 区间合并
    hdu 3397 Sequence operation 线段树 区间更新 区间合并
    hud 3308 LCIS 线段树 区间合并
    POJ 3667 Hotel 线段树 区间合并
    POJ 2528 Mayor's posters 贴海报 线段树 区间更新
    POJ 2299 Ultra-QuickSort 求逆序数 线段树或树状数组 离散化
    POJ 3468 A Simple Problem with Integers 线段树成段更新
  • 原文地址:https://www.cnblogs.com/leesymbol/p/4387721.html
Copyright © 2011-2022 走看看