zoukankan      html  css  js  c++  java
  • C#函数传参的out与ref的应用(转)

    下面我总结下我对out和ref引用参数的看法:
    1.out和ref引用参数的相同点:都是通过引用传递参数给函数;
    2.out和ref引用参数的不同点是:用ref引用传递参数,该参数必须经过初始化,并且不能在调用它的函数中初始化,以下例子是错误的:
                 namespace refConsoleApp
                 {
                     class MyRefClass
                         {
                                     static void MyRefMethod(ref int i)
                                    {
                                             int i=20;
                                    }
                                    static void main(string[] args)
                                    {
                                             int value;                  //not initialized the value;
                                             MyRefMethod(ref value);
                                             Console.WriteLine("The value is {0}",value); 
                                    }
                           }
                 }
    3.使用out引用多个参数来返回多个值,这允许方法任意地返回需要的值,以下例子:
    namespace multi_outConsoleApp
    {
        class MyMultipleoutClass
        {
            static void MyMultipleMethod(out int i, out string str1, out string str2)
            {
                i = 20;
                str1 = "I was born";
                str2 = "zhaoqing";

            }
            static void Main(string[] args)
            {
                int value;
                string s1, s2;
                MyMultipleMethod(out value,out  s1,out  s2);
                Console.WriteLine("The integer value is {0} The first string value is {1} The second string value is {2}", value, s1, s2);

            }
        }
    }

    显示的结果为:
    The integer value is 20
    The first string value is I was born
    The second string value is zhaoqing
    4.  如果一个方法使用ref引用参数,另一个方法使用out引用参数,则这两个相同方法名的函数不能重载,否则出现编译错误,以下例子出现: " cannot define overloaded  methods that differ only on ref and out "
    namespace overloadofConsoleApp
    {
        class overloadofclass
        {
            static void MyMethod(ref int i)
            {
                i = 20;
            }
            static void MyMethod(out int i)
            {
              i = 40;
            }
            static void Main(string[] args)
            {
                int refvalue=0;
                MyMethod(ref refvalue);
                Console.WriteLine("The value is {0}", refvalue);
                int outvalue;
                MyMethod(out outvalue);
               Console.WriteLine("The value is {0}", outvalue);
            }
        }
    }  
    以下例子是正确的:
    namespace overloadofConsoleApp
    {
        class overloadofclass
        {
            static void MyMethod(ref int i)
            {
                i = 20;
            }
            static void MyMethod( int i)
            {
              i = 40;
            }
            static void Main(string[] args)
            {
                int refvalue=0;
                MyMethod(ref refvalue);
                Console.WriteLine("The value is {0}", refvalue);
                int outvalue=0;
                MyMethod(outvalue);
               Console.WriteLine("The value is {0}", outvalue);
            }
        }
    }
    显示结果为:
    The value is 20
    The value is 0
             5.通过ref参数来改变引用类型,因为引用类型作为ref参数来传递,同时该对象会被改变.以下例子:
    namespace refConsoleApp
    {
        class refclass
        {
            static void RefMethod(ref string s)
            {
                s = "I was born in zhaoqing";
            }
            static void Main(string[] args)
            {
                string str = "I am goalbell";
                RefMethod(ref str);
                Console.WriteLine("The value is {0}", str);
            }
        }
    }
    显示结果:
    The value is I was born in zhaoqing

               6.通过ref和out来传递数组,用ref传递数组的时候,必须在main函数里面初始化一个数组,而在被调用的方法中可以指定一个数组为空值或者初始 化成一个不同的数组;用out 传递数组的时候,在被调用的方法中确定为一个数组赋值.以下例子来区别一下它们:
    namespace refszConsoleApp
    {
        class refszclass
        {
            static void RefszMethod(ref int[] arr)
            {
                if (arr == null)        //assigned the null value
                {
                    arr = new int[5];   //initialized to a different array
                }
            }
            static void Main(string[] args)
            {
                int[] theArray ={ 1, 2, 3, 4, 5 };//initialize the theArray
                RefszMethod(ref theArray); // pass the value using of ref
                Console.WriteLine("Array elements are:");
                for (int i = 0; i < theArray.Length; i++)
                {
                    Console.WriteLine(theArray[i] + "");
                }
            }
        }
    }
    namespace outszConsoleApp
    {
        class outszclass
        {
            static void OutszMethod(out int[] arr)
            {

                arr = new int[5] { 1, 2, 3, 4, 5 };//initialize the arr
            }
            static void Main(string[] args)
            {
                int[] theArray ;
                OutszMethod(out theArray);
                Console.WriteLine("Array elements are:");
                for (int i = 0; i < theArray.Length; i++)
                {
                    Console.WriteLine(theArray[i] + "");
                }
            }
        }
    }

  • 相关阅读:
    嵌套查询别名必须性示例。HAVING用法
    分组查询限制。HAVING可写在GROUP BY前。
    合并查询结果集UNION(去重), UNION ALL(不去重),INTERSECT(交集),MINUS(差集,第一个结果集减去第二个结果集,第一个结果集中不在第二个结果集中的记录行),[NOT] EXIST
    18-matlab知识点复习一
    53-java中的queue
    52-2018 蓝桥杯省赛 B 组模拟赛(一)java
    51-迷宫(一)- java版dfs和bfs
    50-2018 蓝桥杯省赛 B 组模拟赛(五)
    49-2015年第6届蓝桥杯Java B组
    46-web页面登入前和登入后控制
  • 原文地址:https://www.cnblogs.com/YSO1983/p/1755665.html
Copyright © 2011-2022 走看看