zoukankan      html  css  js  c++  java
  • C# 中out 参数 和 ref参数的区别

    C#中共有4种参数类型,分别是 传值(by value), 传址 (by reference), 输出参数 (by output), 数组参数 (by array)

    by value => 传值参数不需要额外的修饰符.  传值参数在方法调用过程中如果改变了参数的值,那么传入方法的参数在方法调用完成以后并不因此改变,而是保留原来传入时的值. 传值参数传递的是调用参数的一份拷贝

    by reference => 传址参数需要修饰符 ref.   传址参数如果在方法调用过程改变了参数的值,那么传入方法的参数在调用完成以后也随之改变。 传址参数传递的是调用参数的内存地址,该参数在方法内外指向的是同一个存储位置.

    by out => 输出参数需要修饰符 out

    by array => 数组参数需要修饰符 params

    而ref 和out两者,都是按照地址传递的 (像C中的指针变量),  使用后都将改变原来参数的数值. 两者区别

    ref:  传入的参数必须先被初始化,也就是说会把已经初始化的参数的数值传递进函数。 所以 ref是有进又出

    out: out传入的参数是没有值得,也就是说你是无法把一个数值通过out参数传递进函数中去的。 out 参数传进函数中后,该参数数值为空,所以说你必须初始化一次, 并且要保证所有的out参数在函数返回前都要赋值。 所以 out是只出不进

    Ref关键字使参数按引用传递. 其效果是,当控制权传递回调用方法时,在方法中对参数的任何更改都将反映在该变量中. 使用ref参数,则方法定义和调用方法都必须显示使用ref关键字.

    eg:

    class RefExample
    {
        static void Method(ref int i)
        {
            i = 44;
        }
    
        static void Main()
        {
            int val = 0;
            Method(ref val);
            // val is now 44
        }
    }

    上面的代码也可以看出,传递到ref参数的参数必须最初初始化. 这与out不同,后者的参数在传递之前不需要显示初始化.

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

    class Test_Example
    {
        // Compiler error CS0663: "cannot define overloaded
        // methods that differ only on ref and out".
        public void TestMethod(ref int i) { }
        public void TestMethod(out int i) { }
    }

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

    class RefOutOverloadExample
    {
        public void TestMethod(int i) { }
        public void TestMethod(ref int i) { }
    } 

    Out 关键字也会导致参数通过引用来传递,这一点与ref关键字是一样的。不同的是,ref要求变量必须在传递之前进行初始化,而out则不需要,out 参数即使初始化了,也不会把初始化的值传入到函数中去。

    若要使用out参数,方法定义和调用方法都必须显示使用out关键字

    class OutExample
    {
        static void Method(out int i)
        {
            i = 30;
        }
    
        static void Main()
        {
            int value;
            Method(out value);
            // value is now 30
        }
    }

    所以,如下代码是错误的

    int v3 = 0;
    
    void MyMethod3(out v3);
    {
       Console.WriteLine(v3); //在函数内部,没有对v3进行初始化,也没有保证v3在函数返回前赋值 
     
    }
    
     

    以上文章参考 http://www.cnblogs.com/gsk99/archive/2010/12/13/1904557.html

  • 相关阅读:
    [Visual Studio] [Config] [Transformation] [SlowCheetah] 在非Web工程中使用Transformation
    [SQLSERVER] 把TransactionLog截断
    [Windows] [Firewall] 增加进入规则
    [POWERSHELL] [.net 3.5] [Windows Server] 在Windows Server上安装.NET3.5
    杂碎
    VSCode 使用Settings Sync同步配置(最新版教程,非常简单)
    JavaScript:ES2019 的新特性
    重新认识构造函数、原型和原型链
    如何实现 React 中的状态自动保存?
    深拷贝
  • 原文地址:https://www.cnblogs.com/wphl-27/p/7205369.html
Copyright © 2011-2022 走看看