zoukankan      html  css  js  c++  java
  • C#之out与ref的共性与区别以及用法

    引入:

    首先看一个例子:

     1     class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             int number = 10;
     6             int result = Test(number);
     7             Console.WriteLine("number={0},result={1}", number, result);
     8             Console.ReadKey();
     9         }
    10 
    11         static int Test(int a)
    12         {
    13             a = 20;
    14             return a;
    15         }
    16     }

    此时,显然得到number=10,a=20;把number传给方法Test中的a,在方法number中改变a的值,number的值并不会发生改变。

    然后我们做如下改变

     class Program
        {
            static void Main(string[] args)
            {
                int number;
                int result = Test(number);//此处会报错“使用了未赋值的局部变量‘number’”
                Console.WriteLine("number={0},result={1}", number, result);
                Console.ReadKey();
            }
    
            static int Test(int a)
            {
                a = 20;
                return a;
            }
        }
    

     显然变量没有赋值就使用是错误的

    现在我们使用out代码如下:

     class Program
        {
            static void Main(string[] args)
            {
                int number;
                int result = Test(out number);//注意调用时也需要加out
                Console.WriteLine("number={0},result={1}", number, result);
                Console.ReadKey();
            }
            static int Test(out int a)
            {
                a = 20;//若方法中参数标有out,一定对a先进行赋值才可以使用。
                return a;
            }
        }
    

     此时结果为number=20,result=20;一旦使用out,a就不是往方法里传值而是往外返回值。

    不再是把number的值赋给a了,而是把number与a建立起一种联系,在方法Test中必须对a进行赋值,对a进行赋值后就相当于对number进行赋值(即把number的引用传递给a)

     

    out总结:

    1.在方法的参数前加out,那么在传参数的时候也必须在参数前使用out,以表明此参数并不是用来传入而是用来传出值的。

    2.如果参数是以out形式传入的,那么在传入不能对其进行赋值。

    3.在方法中对于用out修饰的参数,必须对其赋值,且必须在其使用前进行赋值。

    ref:

        class Program
        {
            static void Main(string[] args)
            {
                int number = 10;
                int result = Test(ref number);//注意调用时也需要加ref
                Console.WriteLine("number={0},result={1}", number, result);
                Console.ReadKey();
            }
            static int Test(ref int a)
            {
                int b = a;
    a=20; return b; } }

     此时结果为:number=20,result=10;此时把number的值传入了方法Test,并且变量b使用了,然后对a进行赋值20,并且传了出去。

    即ref既可以传入参数也可以传出参数。

    总结ref与out

    out用于传入值,ref是双向的既可以传入又可以传出。(其原理为引用类型传递与值类型传递,不使用out与ref时为值类型传递,使用时为引用类型传递)

    在传参数的过程中如果有ref与out修饰,那么改变方法中参数变量的值,也会改变使用者方法中变量的值。

     out的使用实例

    1.微软提供了一个int类型的方法

    int.TryParse(string s,out int result)

    首先解释一下这个方法

    该方法的返回值为bool型。即转换成功返回true,转换失败返回false;同时转换成功会返回一个result,result的值即为转换后的值,转换失败result则为null

    下面我们自己写一个方法实现这个功能

      class Program
        {
            static void Main(string[] args)
            {
                string s = "123";
                int result;
                if (ConvertInt(s, out result))
                {
                    Console.WriteLine("转换成功" + result);
                }
                else
                {
                    Console.WriteLine("转换失败!");
                }
                Console.ReadKey();
            }
            static bool ConvertInt(string s,out int result)
            {
                try
                {
                    result = Convert.ToInt32(s);
                    return true;
                }
                catch {
                    result = 0;//注意此处,必须对out修饰的参数result赋值
                    return false;
                }            
            }
        }
    

     可在需要返回多个值时使用out与ref。

    可以使用如下实例练手!

    对一个数组元素求和并返回和与数组元素的最大值和最小值

  • 相关阅读:
    WinForm界面开发之布局控件"WeifenLuo.WinFormsUI.Docking"的使用
    分享几个.NET WinForm开源组件,纪念逐渐远去的WinForm。。。
    小议主子表INT自增主键插入记录的方法SQL server]教程
    微软工程师主讲的SqlServer2005视频教程
    11 个重要的数据库设计规则
    sql数据库设计学习---数据库设计规范化的五个要求
    YY淘宝商品数据库设计
    ASP.NET MVC的客户端验证:jQuery的验证
    ASP.NET MVC的客户端验证:jQuery验证在Model验证中的实现
    UNIX标准化及实现之POSIX标准可选头文件
  • 原文地址:https://www.cnblogs.com/hunternet/p/4695093.html
Copyright © 2011-2022 走看看