使用值类型变量ref和out

时间:2015-04-14 19:22:57

标签: c# methods out ref

msdn documentation on out表示必须在函数内部分配一个作为out传递的参数。网站上的例子:

class OutExample
{
    static void Method(out int i)
    {
        i = 44;
    }
    static void Main()
    {
        int value;
        Method(out value);
       // value is now 44
    }
 }

根据我的理解,当声明int“value”时,它已被赋值为默认值0(因为int是一个值类型,不能为null。)那么为什么“Method”需要修改它的值?

同样,如果要使用“ref”代替out,是否需要初始化“value”?

有这样的问题What's the difference between the 'ref' and 'out' keywords?,但没有人愿意将2和2放在一起。

4 个答案:

答案 0 :(得分:4)

  

根据我的理解,当int"值"宣布它是   已经分配了默认值0(因为int是值类型和   不能为空。)

不,那不正确。

本地变量在创建时未赋值。通过移动堆栈指针为堆栈指针腾出空间来创建局部变量的空间。该内存区域未被清除,它将包含碰巧在那里的任何值。

编译器会强制您在变量可以使用之前为其赋值,以便"垃圾"它最初包含的值永远不会被使用。

  

同样,如果" ref"是用来代替出去,有没有   需要初始化"值"?

不需要在方法中设置该值,因为它已经有值。用于调用该方法的变量需要初始化:

static void Method(ref int i) {
    // doesn't need to set the value
}

static void Main() {
    int value;
    value = 42; // needs to be initialised before the call
    Method(ref value);
   // value is still 42
}

答案 1 :(得分:0)

默认情况下,int没有赋值,即使有默认值...尝试:

Console.WriteLine(default(int)); // output = '0'
int foo;
Console.WriteLine(foo); // compile error - Use of unassigned local variable

out参数的合约是保证方法为其赋值。 ref参数的合同没有这样的保证。

答案 2 :(得分:0)

必须为变量赋值。但是你在帖子中提到的out参数的概念具有更多的语义含义。

如果您传递out参数,则您希望调用的函数必须分配它。 C#编译器简单地强制执行“良好的程序员”技能来编译时间控制,以获得更好的代码风格。

答案 3 :(得分:0)

有时候你的方法需要返回多个值,所以在这种情况下你可以通过ref和out参数返回那些额外的值。对这些的一个很好的参考是" TryParse" .NET框架中的方法,例如" Int32.TryParse方法"

[1]: https://msdn.microsoft.com/en-us/library/f02979c7%28v=vs.110%29.aspx

您可以在MSDN上的上述链接中找到更多信息。