zoukankan      html  css  js  c++  java
  • C# ref and out

    相同点:

      1. ref 和 out 都是按地址传递的,使用后都将改变原来参数的数值;

      2. 方法定义和调用方法都必须显式使用 ref 或者 out关键字;

      3. 通过ref 和 ref 特性,一定程度上解决了C#中的函数只能有一个返回值的问题。

    不同点:

      传递到 ref 参数的参数必须初始化,否则程序会报错。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                int a = 1;
                int b = 2;
                Fun(ref a,ref b);
                Console.WriteLine("a:{0},b:{1}", a, b);//输出:3和4说明传入Fun方法是a和b的引用
            }
            static void Fun(ref int a, ref int b) {
                a = 3;  
                b = 4;
            }
        }
    }

      out关键字无法将参数值传递到out参数所在的方法中, out参数的参数值初始化必须在其方法内进行,否则程序会报错。

    using System.Text;
    
    namespace ConsoleApp1
    {
        class Program
        {
            static void Main(string[] args)
            {
                int a = 100;
                int b;
                Fun(out a, out b);
                Console.WriteLine("a:{0},b:{1}", a, b);
            }
    
            static void Fun(out int a, out int b)
            {
                //a = 1+2;
                if (a == 100)
                    a = 2;
    
                b = 1;
            }
    
        }
    }

    代码里红体字a 报错 “Use of unassigned out parameter 'a' ”  

    下面的代码是正确的。

    using System;
    
    namespace ConsoleApp1
    {
        class Program
        {
            static void Main(string[] args)
            {
                int a = 100;
                int b;
                Fun(out a, out b);
                Console.WriteLine("a:{0},b:{1}", a, b);
            }
    
            static void Fun(out int a, out int b)
            {
                a = 1+2;
    
                b = 1;
            }
    
        }
    }

    输出结果为:

    注意点:

    using System;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            public void SampleMethod(ref int i) { }
            public void SampleMethod(out int i) { }
    
        }
    }

    上面代码会报错“ 'Program' cannot define an overloaded method that differs only on parameter modifiers 'out' and 'ref'  ”

    尽管 ref 和 out 在运行时的处理方式不同,但在编译时的处理方式相同。因此,如果一个方法采用 ref 参数,而另一个方法采用 out 参数,则无法重载这两个方法。例如,从编译的角度来看,以下代码中的两个方法是完全相同的,因此将不会编译上面的代码。

    using System;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            public void SampleMethod(int i) { }
            public void SampleMethod(ref int i) { }
        }
    }

    但是,如果一个方法采用 ref 或 out 参数,而另一个方法不采用这两个参数,则可以进行重载。

    参考点1    参考点2

          

    道虽迩,不行不至;事虽小,不为不成。
  • 相关阅读:
    sqlilabs 5
    sqlilabs 1-4
    ipset
    kill命令的使用
    docker 札记
    批量删除数据库表中数据行
    正则表达式调试
    TimescaleDB安装学习
    记一次 Centos7 postgresql v11 安装时序数据库 TimescaleDB
    "知识库"
  • 原文地址:https://www.cnblogs.com/LeeMacrofeng/p/14469359.html
Copyright © 2011-2022 走看看