Ref和Out参数问题

16 浏览
0 Comments

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日
0
0 Comments

在第一个示例中,您未指定变量是一个引用,因为它是一个基本类型,它只复制提供的数字。因此,在Example1中的valueMainvalue的副本。

第二个示例使用了引用。这意味着在函数Example2内部和Main内部都引用了内存中的同一位置,因此在进入和退出函数时传递了值。

在第三个示例中,out关键字与第二个示例相同,只是在进入函数时初始化为0。因此,它只是用于返回某种数据的参数。在退出函数时,该值只是传递出去。

0
0 Comments

看看这个能否帮助:

没有“装饰器”

static void Example(int value)
{
    Console.WriteLine("Value is {0}", value);
    value = 99;
}
usage
{
    int value = 10;
    Example(notADefaultValue); // Will print 
    Console.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 print 
    Example(); // will print 
}

总结:默认值允许您调用一个方法而不需要显式传递参数,将使用默认值。

引用参数:

static void Example(ref int value)
{
    Console.WriteLine("Value is {0}", value);
    value = 99;
}
usage
{
    int value = 10;
    Example(ref value); // Will print 
    Console.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 print 
    Console.WriteLine("Value is {0}", value); // Will print 
}

总结:输出参数类似于返回变量,但是通过方法的签名传递。最常见的例子是TryParse,其中方法返回重要信息,根据该信息,输出参数可以是有效的或无效的(如果为true,则有效)。

0