zoukankan      html  css  js  c++  java
  • C#中ref参数及out参数对比

    ref 关键字和out关键字均会导致参数通过引用来传递(相同点1)。这是两者的共同点。

    通过引用传递参数,会使方法中对参数所做的任何修改都将反映在该变量中。

    两者还有一个共同点,那就是:若要使用 ref 参数或out参数,则方法定义和调用方法都必须显式使用 ref 关键字或out关键字(相同点2)。

    那两者有什么不同点呢?

    两者的不同点就是:传递到 ref 参数的参数必须最先初始化,而out参数在传递之前不需要显式初始化(不同点)。

    下面来看个简单的例子,该实例包括两部分。

    先给出第一部分代码,如下:

    static void Main(string[] args)
    {
         int a = 0;            
         ExpWithRef(ref a);    
         Console.WriteLine(a);
         int b = 0;
         ExpWithOutRef(b);
         Console.WriteLine(b);
    }
    private static void ExpWithRef(ref int x)
    {
         x = x + 1;
    }
    private static void ExpWithOutRef(int y)
    {
         y = y + 1;
    }

    这部分代码运行后输出“1 0”。

    因为ExpWithRef方法通过引用传递参数,所以执行完代码ExpWithRef(ref a)”后,a的值被改变,变成了1。而ExpWithOutRef方法通过值传递参数,所以执行完代码“ExpWithOutRef(b)”后,b的值保持不变,仍为0。

    另外,ExpWithRef方法通过ref引用传递参数,所以方法定义和调用方法都显式地使用了 ref 关键字,且实参a在函数调用前已被初始化。

    下面给出第二部分实例代码:

    static void Main(string[] args)
    {
         int a;
         ExpWithOut(out a);
         Console.WriteLine(a);
    }
    private static void ExpWithOut(out int x)
    {
         x = 0;
         x = x + 1;
    }
    

    这部分代码中,ExpWithOut方法通过out引用传递参数,所以参数a在方法调用前并没有初始化,而是在ExpWithOut方法内部进行初始化,并对其加1,函数调用返回后参数a的值变成了1(记住,这里是引用传递参数),所以最后的输出结果为“1”。

    好了,就这些了。

  • 相关阅读:
    windows RabbitMQ Server 环境配置中的一些坑
    Redis自定义fastJson Serializer
    如何使用Feign构造多参数的请求
    跨域访问支持(Spring Boot、Nginx、浏览器)
    chrome浏览器的跨域设置
    Jenkins手把手图文教程[基于Jenkins 2.164.1]
    Spring Boot 2发送邮件手把手图文教程
    poi读取Excel模板并修改模板内容与动态的增加行
    Lock类-ReentrantLock的使用
    类ThreadLocal的使用与源码分析
  • 原文地址:https://www.cnblogs.com/pangblog/p/3285566.html
Copyright © 2011-2022 走看看