`

C#函数传参的out与ref的应用

 
阅读更多

下面我总结下我对out和ref引用参数的看法: 
1.out和ref引用参数的相同点:都是通过引用传递参数给函数; 
2.out和ref引用参数的不同点是:用ref引用传递参数,该参数必须经过初始化,并且不能在调用它的函数中初始化,以下例子是错误的: 
             namespace refConsoleApp 
             { 
                 class MyRefClass 
                     { 
                                 static void MyRefMethod(ref int i) 
                                { 
                                         int i=20; 
                                } 
                                static void main(string[] args) 
                                { 
                                         int value;                  //not initialized the value; 
                                         MyRefMethod(ref value); 
                                         Console.WriteLine("The value is {0}",value);  
                                } 
                       } 
             } 
3.使用out引用多个参数来返回多个值,这允许方法任意地返回需要的值,以下例子: 
namespace multi_outConsoleApp 

    class MyMultipleoutClass 
    { 
        static void MyMultipleMethod(out int i, out string str1, out string str2) 
        { 
            i = 20; 
            str1 = "I was born"; 
            str2 = "zhaoqing";

        } 
        static void Main(string[] args) 
        { 
            int value; 
            string s1, s2; 
            MyMultipleMethod(out value,out  s1,out  s2); 
            Console.WriteLine("The integer value is {0} The first string value is {1} The second string value is {2}", value, s1, s2);

        } 
    } 
}

显示的结果为: 
The integer value is 20 
The first string value is I was born 
The second string value is zhaoqing 
4.  如果一个方法使用ref引用参数,另一个方法使用out引用参数,则这两个相同方法名的函数不能重载,否则出现编译错误,以下例子出现: " cannot define overloaded  methods that differ only on ref and out " 
namespace overloadofConsoleApp 

    class overloadofclass 
    { 
        static void MyMethod(ref int i) 
        { 
            i = 20; 
        } 
        static void MyMethod(out int i) 
        { 
          i = 40; 
        } 
        static void Main(string[] args) 
        { 
            int refvalue=0; 
            MyMethod(ref refvalue); 
            Console.WriteLine("The value is {0}", refvalue); 
            int outvalue; 
            MyMethod(out outvalue); 
           Console.WriteLine("The value is {0}", outvalue); 
        } 
    } 
}   
以下例子是正确的: 
namespace overloadofConsoleApp 

    class overloadofclass 
    { 
        static void MyMethod(ref int i) 
        { 
            i = 20; 
        } 
        static void MyMethod( int i) 
        { 
          i = 40; 
        } 
        static void Main(string[] args) 
        { 
            int refvalue=0; 
            MyMethod(ref refvalue); 
            Console.WriteLine("The value is {0}", refvalue); 
            int outvalue=0; 
            MyMethod(outvalue); 
           Console.WriteLine("The value is {0}", outvalue); 
        } 
    } 

显示结果为: 
The value is 20 
The value is 0 
         5.通过ref参数来改变引用类型,因为引用类型作为ref参数来传递,同时该对象会被改变.以下例子: 
namespace refConsoleApp 

    class refclass 
    { 
        static void RefMethod(ref string s) 
        { 
            s = "I was born in zhaoqing"; 
        } 
        static void Main(string[] args) 
        { 
            string str = "I am goalbell"; 
            RefMethod(ref str); 
            Console.WriteLine("The value is {0}", str); 
        } 
    } 

显示结果: 
The value is I was born in zhaoqing

           6.通过ref和out来传递数组,用ref传递数组的时候,必须在main函数里面初始化一个数组,而在被调用的方法中可以指定一个数组为空值或者初始 化成一个不同的数组;用out 传递数组的时候,在被调用的方法中确定为一个数组赋值.以下例子来区别一下它们: 
namespace refszConsoleApp 

    class refszclass 
    { 
        static void RefszMethod(ref int[] arr) 
        { 
            if (arr == null)        //assigned the null value 
            { 
                arr = new int[5];   //initialized to a different array 
            } 
        } 
        static void Main(string[] args) 
        { 
            int[] theArray ={ 1, 2, 3, 4, 5 };//initialize the theArray 
            RefszMethod(ref theArray); // pass the value using of ref 
            Console.WriteLine("Array elements are:"); 
            for (int i = 0; i < theArray.Length; i++) 
            { 
                Console.WriteLine(theArray[i] + ""); 
            } 
        } 
    } 

namespace outszConsoleApp 

    class outszclass 
    { 
        static void OutszMethod(out int[] arr) 
        {

            arr = new int[5] { 1, 2, 3, 4, 5 };//initialize the arr 
        } 
        static void Main(string[] args) 
        { 
            int[] theArray ; 
            OutszMethod(out theArray); 
            Console.WriteLine("Array elements are:"); 
            for (int i = 0; i < theArray.Length; i++) 
            { 
                Console.WriteLine(theArray[i] + ""); 
            } 
        } 
    } 
}

分享到:
评论

相关推荐

    c# 调用C++编写 的DLL函数各种参数传递问题。

    在 C# 中,ref关键字将使得参数被传递给 C++ 函数,并且可以接收返回的值。 4. 传递结构体指针(C++ 填充) 在 C++ 中,函数原型为 BOOL NetGetConnectDetail(NET_INFO_STRUCT *lpNetInfo);,在 C# 中可以使用 ...

    C#调用DLL中非托管C++函数参数类型对照

    * 一维数组:C#参数在基本类型前加ref或out,out表示有返回数据。例如调用C++的f(float[] a),在C#中,为f(ref a)。 * 数据结构:C++中的struct SAMPLE_DATA { byte SampleID[255]; float Value[6]; } 在C#中对应...

    c# 参数传递,参数调用

    另外,C# 还提供了 `out` 关键字,它与 `ref` 类似,也是用于传递引用,但 `out` 参数必须在函数内部被初始化,并且调用者不需要预先赋值。 除了值传递和引用传递,C# 还有一种特殊的参数传递方式——按装箱值类型...

    ref 和out传参的区别分析

    在.NET编程中,`ref`和`out`都是C#中的两种特殊的参数修饰符,用于在函数调用中传递变量的引用,而不是其值。它们都允许方法修改调用者提供的变量,但它们之间存在一些关键区别,这些区别在理解和使用时至关重要。 ...

    C#中实现窗体间传值

    1. **构造函数传参**: 当打开新窗体时,可以通过传递参数给新窗体的构造函数来实现数据传递。例如,假设有两个窗体Form1和Form2,我们可以在Form1中创建Form2实例并传递数据: ```csharp Form2 form2 = new ...

    在java中实现C#语法里的按引用传递参数的方法

    C#提供了`ref`和`out`关键字来实现引用传递,而在Java中,情况有所不同。 在C#中,`ref`关键字用于按引用传递参数。这意味着当使用`ref`调用方法时,方法内部对参数的修改会影响到原始变量。例如,如果在主函数中有...

    理解C#中参数的值和引用以及传递结构和类引用的区别

    若要通过引用传递参数,请使用 ref 或 out 关键字。 下面的示例阐释值与引用参数之间的区别: class Program { static void Main(string[] args) { int arg; // Passing by value. // The value of arg in ...

    C#中参数数组、引用参数和输出参数示例详解

    输出参数使用out关键字,其效果与引用参数几乎相同,但不同点是:引用参数的实参必须是已经赋值的变量,而输出参数不必。函数使用输出参数时,应该把它看作是未赋值的。例如: ```csharp static int MaxValue (int...

    引用类型传值方法

    此外,C#中的`ref`和`out`关键字提供了另一种传递引用类型的方式。使用`ref`关键字,可以确保参数是按引用传递的,这意味着函数可以改变实参的值。`out`关键字类似,但要求函数必须为参数分配值。这两种方式可以用于...

Global site tag (gtag.js) - Google Analytics