• ref 和out的区别


    在C#语言中,参数的传递有两种,一种是值传递,一种是引用传递。ref与out这两种方式都属于引用传递,只是他们的用法稍有不同。下面看几个例子
    
    使用ref的例子
    
     class test
        {
            static void gump(int i)
            {
    
                i=12;    
    
                i += 1; 
            }
         
            static void Main()
            {
                int i = 10;
                gump(i);
                Console.WriteLine(i);
            }
       }
    
    输出结果为:10
    
    再看
    
    class test
        {
            static void gump(ref int i)
            {
    
                i=12;                  //这个可以不赋值,也不会报错
                i += 1;
            }
         
            static void Main()
            {
                int i = 10;
                gump(ref i);
                Console.WriteLine(i);
            }
       }
    
    输出结果:11
    
    使用out的例子
    
    class test
        {
            static void gump(out int i)
            {
    
                i=12;                 //必须对i初始化,否则会报错。  (这块就是ref和out的区别之一)
                i += 1;
            }
         
            static void Main()
            {
                int i = 10;
                gump(out i);
                Console.WriteLine(i);
            }
       }
    
     
    
    
    当希望方法返回多个值时,声明 out 方法非常有用。使用 out 参数的方法仍然可以返回一个值。一个方法可以有一个以上的 out 参数。
    
    下面来举例说明一下out 的用法
    
    示例:
    
     class gump
        {
            public void math_routines(double x, out double half, out double squared, out double cubed)
            {
                half = x / 2;                         //必须初始化,否则会报错
                squared = x * x;                  //必须初始化,否则会报错
                cubed = x * x * x;                //必须初始化,否则会报错
    
            }
        }
        class TestApp
        {
            public static void Main()
            {
                gump g = new gump();
                double x1 = 60;
                double half1 = 0;
                double squared1 = 0;
                double cubed1 = 0;
    
                Console.WriteLine("Before method->x1={0},half1={1},squared1={2},cubed1={3}", x1,half1 ,squared1,cubed1);
    
    
                g.math_routines(x1, out half1, out squared1, out cubed1);
                Console.WriteLine("After method->x1={0},half1={1},squared1={2},cubed1={3}", x1, half1, squared1, cubed1);
    
            }
    
           
        }
    
    
    ref用法示例:
    
     class gump
        {
            public double square(ref double x)
            {
                x *= x;                        //可以不初始化,不会报错
                return x;
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                gump g = new gump();
                double a = 3;
                double b = 5;
                Console.WriteLine("Before square->a={0},b={1}", a, b);
    
                a = g.square(ref a);
                Console.WriteLine("After square->a={0},b={1}", a, b);
            }
        }
    
    从上面的例子可以看出:
    
    ref必须先初始化才能完成引用。out是内部为外部赋值,所以不需要初始化。
    
    ref是内部对外部的值进行改变,而out则是内部为外部变量赋值。可以返回多个值。
    

      

  • 相关阅读:
    PAT L3-021 神坛
    2019.07.08【NOIP提高组】模拟 A 组 总结
    2019.07.06【NOIP提高组】模拟 A 组 总结
    2019.07.05【NOIP提高组】模拟 A 组 总结
    jzoj 1287. 躲雨
    jzoj 4614. 【NOIP2016模拟7.12】字符串
    jzoj 3317. 【BOI2013】管道
    2019.07.04【NOIP提高组】模拟 A 组
    jzoj 3316. 【BOI2013】非回文数字
    jzoj 4616. 【NOI2016模拟7.12】二进制的世界
  • 原文地址:https://www.cnblogs.com/wushuaizaiza/p/3667297.html
Copyright © 2020-2023  润新知