Ref和Out参数问题
Ref和Out参数问题
这个问题已经有了答案:
我曾今认为我了解它们的不同,但现在我并不确定。我已经多次阅读了技术的解释,但我还是不了解发生了什么。我有这个例子。
class Program { static void Main() { int val = 0; Example1(val); Console.WriteLine(val); // Still 0! Example2(ref val); Console.WriteLine(val); // Now 2! Example3(out val); Console.WriteLine(val); // Now 3! } static void Example1(int value) { value = 1; } static void Example2(ref int value) { value = 2; } static void Example3(out int value) { value = 3; } }
我一直认为默认参数的不同之处在于,如果我将 \"val\" 传递给 \"Example1\",我不能使用赋值。
但使用 \"ref\" 关键字,\"val\" 仍然是0,但我创建了一个引用,它现在被视为 \"Example2(ref val)\" 中的变量 \"value\"。到目前为止,我在纠结什么?如果我使用了
int value = 0; Example1(value); Console.WriteLine(value); // this would then return 1 correct?
那么,\"out\" 关键字又发生了什么?和 \"ref\" 一样吗?
admin 更改状态以发布 2023年5月21日
看看这个能否帮助:
没有“装饰器”
static void Example(int value) { Console.WriteLine("Value is {0}", value); value = 99; } usage { int value = 10; Example(notADefaultValue); // Will printConsole.WriteLine("Value is {0}", value); // will print }
总结:值类型(结构体/枚举/整数/双精度等)默认不作为引用传递,因此在方法中对变量做的任何事都不会影响调用者。因此,使用“ref”关键字。如果将引用类型(即类)传递给方法并更改其内部,则会影响调用者。
默认参数:
static void Example(int value = 5) { Console.WriteLine("Value is {0}", value); } usage { int notADefaultValue = 10; Example(notADefaultValue); // Will printExample(); // will print }
总结:默认值允许您调用一个方法而不需要显式传递参数,将使用默认值。
引用参数:
static void Example(ref int value) { Console.WriteLine("Value is {0}", value); value = 99; } usage { int value = 10; Example(ref value); // Will printConsole.WriteLine("Value is {0}", value); // Will print }
总结:如果将一个值类型作为引用(reference)传递,该值本身将被更改。所有引用类型默认情况下都作为引用传递。值得一提的是,整数是一个原始类型,因此需要显式的“ref”。
输出参数:
static void Example(out int value) { value = 99; Console.WriteLine("Value is {0}", value); } usage { int value; // no need to init it Example(out value); // Will printConsole.WriteLine("Value is {0}", value); // Will print }
总结:输出参数类似于返回变量,但是通过方法的签名传递。最常见的例子是TryParse,其中方法返回重要信息,根据该信息,输出参数可以是有效的或无效的(如果为true,则有效)。