The transfer of parameters is generally divided into two types: one is "value passing" i.e. a copy of the passed argument, and since it is a copy, any action on the parameter in the function will not be reflected in the original argument. The other is "reference passing", which is: the address where the argument is passed (the parameter and the argument point to the same memory address), then any changes to the parameter in the function are reflected in the original argument.
The two ways to implement reference passing in C # are: Ref and out. Of course, these two ways also have their differences, the following will gradually explain their differences.
- When using the REF keyword for "reference passing", the passed-in argument must first be initialized, just like a pointer in C and C + +, it must be assigned a value (to point it to a specified memory location), otherwise it does not necessarily point to the memory where, so it is dangerous, not allowed. When you use the Out keyword for reference passing, the incoming arguments do not have to be initialized first. As shown in the following example:1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5
6namespace Refandout
7{
8 Class Refandouttesting
9 {
Ten static void Main (string[] args)
11 {
int x;
int y;
Outtest (out x, out y);
Console.WriteLine (String. Format ("x = {0}, y = {1}", X, y));
16
+ int a = 100;
int b = 200;
Reftest (ref a, ref B);
Console.WriteLine (String. Format ("a = {0}, y = {1}", A, b));
21}
The//out parameter does not have to be initialized before it is used
public static void Outtest (out int first, out int second)
25 {
First = 1;
Second = 2;
29}
The//ref parameter must be initialized before use
public static void Reftest (ref int first, ref int second)
32 {
first = 1111;
second = 2222;
35}
36}
37}
- Although using the Out keyword for "reference passing", the passed-in arguments do not have to be initialized first, but in the function you must first initialize the parameters before you use them. Because: When the out parameter is used, the program first empties the Out argument (so that the actual argument is not used for this function first) and then the parameter is manipulated accordingly; the initialization of the parameter must be completed before leaving the function (even if you do not do anything to the parameter). Otherwise, the pointer to the parameter does not know where to point. If you change the Outtest function above: 1 public static void Outtest (out int first, out int second)
2 {
3 first = second;
4//first = 1;
5//second = 2;
6} will prompt you: use of unassigned out Parmeter ' second '. The same error occurs even if you first initialize the argument (because the parameter is emptied first)1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace Outandref
7 {
8 class Program
9 {
Ten static void Main (string[] args)
11 {
The//out variable does not have to be displayed before it is used
int x = 1111;
int y = 2222;
Outtest (out x, out y);
Console.WriteLine ("x = {0}, y = {1}", X, y);
17}
18
public static void Outtest (out int first, out int second)
21 {
22//Before you leave this function, you must assign a value to first and second, otherwise you will get an error.
At first = second;
24//above this line error, because after the use of the out, first and second are emptied, need to be re-assigned, even if the function before the call to assign a value is not
First = 1;
Second = 2;
27}
29}
31}
32
- So the above two points can be summed up as: Ref has a go in, out have infested.
- Use ref and out for reference passing, and when defining methods and calling methods, add the ref and out keyword before the parameter to satisfy the match.
- Because the property is a method, not a variable, and the pointer is a variable. Therefore, none of the attributes can be passed as ref and out parameters. If you declare two properties in the Refandouttesting class above and pass it to the Reftest and Outtest methods, an error will occur!1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace Refandout
7 {
8 Class Refandouttesting
9 {
10//attribute (is method, not variable) so it cannot be used as ref and out parameters
public static int Firstnumber
12 {
get;
Set;
15}
public static int Secondnumber
17 {
get;
Set;
20}
21st
22//fields can be used as ref and out parameters
The public static int mynumber;
public static int yournumber;
25
-static void Main (string[] args)
27 {
28//Correct
Outtest (out MyNumber, out yournumber);
Console.WriteLine ("MyNumber = {0}, Yournumber = {1}", MyNumber, Yournumber);
Reftest (ref mynumber, ref yournumber);
Console.WriteLine ("MyNumber = {0}, Yournumber = {1}", MyNumber, Yournumber);
33
34//Error
Outtest (out Firstnumber, out secondnumber);
Console.WriteLine ("Firstnumber = {0}, Secondnumber = {1}", Firstnumber, Secondnumber);
PNS Reftest (ref firstnumber, ref secondnumber);
Console.WriteLine ("Firstnumber = {0}, Secondnumber = {1}", Firstnumber, Secondnumber);
45}
46}
47}
C # ref and out summary