C# out ref

out 参数修饰符

out 关键字通过引用传递参数。

1、使用 out 参数,方法定义和调用方法均必须显式使用 out 关键字。

2、out 参数传递的变量在方法调用中传递之前不必进行初始化。 但是,被调用的方法需要在返回之前赋一个值。

在 C# 6 及更早版本中,必须先在单独的语句中声明变量,然后才能将其作为 out 参数传递。 下面的示例先声明了变量 number,然后再将它传递给将字符串转换为数字的 Int32.TryParse 方法。

  static void Main(string[] args)
        {   int  a;
            string y = "999kk";
            bool  B = MyintParse(y,out  a);
        }

public static bool MyintParse(string s,out int r)
        {
            r = 0;//out 先赋值后使用
            try
            {
                r = int.Parse(s);
                return true;
            }
            catch (Exception)
            {
                return false;
                throw;
            }
        }

从 C# 7.0 开始,可以在方法调用的参数列表而不是单独的变量声明中声明 out 变量。 这使得代码更简洁可读,还能防止在方法调用之前无意中向该变量赋值。 下面的示例与上一个示例基本相同,不同之处在于它在对 Int32.TryParse 方法的调用中定义了 number 变量。

string numberAsString = "1640";

int number;
if (Int32.TryParse(numberAsString, out number))
    Console.WriteLine($"Converted '{numberAsString}' to {number}");
else
    Console.WriteLine($"Unable to convert '{numberAsString}'");
// The example displays the following output:
//       Converted '1640' to 1640

ref 关键字指示按引用传递的值。

在方法签名和方法调用中,按引用将参数传递给方法。

在方法签名中,按引用将值返回给调用方。

在成员正文中,指示引用返回值是否作为调用方欲修改的引用被存储在本地,或在一般情况下,局部变量按引用访问另一个值。

struct 声明中声明 ref structref readonly struct

1、若要使用 ref 参数,方法定义和调用方法均必须显式使用 ref 关键字

2、传递到 refin 形参的实参必须先经过初始化,然后才能传递。 这与 out 形参不同,在传递之前,不需要显式初始化该形参的实参。

ref作为参数的函数在调用前,实参必须赋初始值。否则编译器将提示:使用了未赋值的局部变量;

out作为参数的函数在调用前,实参可以不赋初始值。(C# 7.0 开始)

有out|ref关键字的方法可以与无out和ref关键字的方法构成重载;但如想在out和ref间重载,编译器将提示:不能定义仅在ref和out的上的方法重载

out用于传出值,ref可以理解为双向的,即可传入,亦可传出。

如果有out或ref修饰的话,那么改变方法中的参数变量的值,调用者方法中变量的值也会相应额改变。

原文地址:https://www.cnblogs.com/zeng-qh/p/10303470.html