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
变量。 这使得代码更简洁可读,还能防止在方法调用之前无意中向该变量赋值。 下面的示例与上一个示例基本相同,不同之处在于它在对 方法的调用中定义了 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
在方法签名和方法调用中,按引用将参数传递给方法。
在方法签名中,按引用将值返回给调用方。
在成员正文中,指示引用返回值是否作为调用方欲修改的引用被存储在本地,或在一般情况下,局部变量按引用访问另一个值。
在 struct
声明中声明 ref struct
或 ref readonly struct
。
1、若要使用 ref
参数,方法定义和调用方法均必须显式使用 ref
关键字
2、传递到 ref
或 in
形参的实参必须先经过初始化,然后才能传递。 这与 形参不同,在传递之前,不需要显式初始化该形参的实参。
ref作为参数的函数在调用前,实参必须赋初始值。否则编译器将提示:使用了未赋值的局部变量;
out作为参数的函数在调用前,实参可以不赋初始值。(C# 7.0 开始)
有out|ref关键字的方法可以与无out和ref关键字的方法构成重载;但如想在out和ref间重载,编译器将提示:不能定义仅在ref和out的上的方法重载
out用于传出值,ref可以理解为双向的,即可传入,亦可传出。
如果有out或ref修饰的话,那么改变方法中的参数变量的值,调用者方法中变量的值也会相应额改变。