out关键字,只修改不读,也就是说,在实参给形参传递的时候,实参不能初始化,注意是不能不是不用
int initializeInMethod;
OutArgExample(out initializeInMethod);
Console.WriteLine(initializeInMethod); // value is now 44
void OutArgExample(out int number)
{
number = 44;
}
不能给 initializeInMethod赋初值,在方法内对它进行修改,方法结束后,这个变量initializeInMethod自动有了值,不用return
跟ref in 一样,也是无论定义方法还是调用方法都要用out
在方法的重载上和ref in 一样,如果其他都相同,仅仅是方法的签名有ref in out区分,那无法判断他们不是一个方法,如下:
class CS0663_Example
{
// Compiler error CS0663: "Cannot define overloaded
// methods that differ only on ref and out".
public void SampleMethod(out int i) { }
public void SampleMethod(ref int i) { }
}
SampleMethod方法返回值类型,方法名,参数类型,个数,顺序,都相同,仅仅修饰符不同,系统还是认定他们是一个方法,所以出现编译错误。
下面是正确的:
class OutOverloadExample
{
public void SampleMethod(int i) { }
public void SampleMethod(out int i) => i = 5;
}
声明 out 参数
使用 out 参数声明方法是返回多个值的经典解决方法
void Method(out int answer, out string message, out string stillNull)
{
answer = 44;
message = "I've been returned";
stillNull = null;
}
int argNumber;
string argMessage, argDefault;
Method(out argNumber, out argMessage, out argDefault);
Console.WriteLine(argNumber);
Console.WriteLine(argMessage);
Console.WriteLine(argDefault == null);
// The example displays the following output:
// 44
// I've been returned
// True
调用具有 out 参数的方法
原始的写法
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
从 C# 7.0 开始,可以在方法调用的参数列表而不是单独的变量声明中声明 out 变量。 这使得代码更简洁可读,还能防止在方法调用之前无意中向该变量赋值。 下面的示例与上一个示例基本相同,不同之处在于它在对 Int32.TryParse 方法的调用中定义了 number 变量。
string numberAsString = "1640";
if (Int32.TryParse(numberAsString, out int number))
Console.WriteLine($"Converted '{numberAsString}' to {number}");
else
Console.WriteLine($"Unable to convert '{numberAsString}'");
// The example displays the following output:
// Converted '1640' to 1640
在上一个示例中,number 变量被强类型化为 int。 你也可以声明一个隐式类型本地变量,如以下示例所示。
string numberAsString = "1640";
if (Int32.TryParse(numberAsString, out var number))
Console.WriteLine($"Converted '{numberAsString}' to {number}");
else
Console.WriteLine($"Unable to convert '{numberAsString}'");
// The example displays the following output:
// Converted '1640' to 1640
参考:out 参数修饰符