关于c#:ref和out,带有值类型变量

ref and out with value type variables

MSDN文档的门诊中说这一参数通过AS时必须指定一个值,内部的函数。例如,从网站: </P >

1
2
3
4
5
6
7
8
9
10
11
12
13
class OutExample
{
    static void Method(out int i)
    {
        i = 44;
    }
    static void Main()
    {
        int value;
        Method(out value);
       // value is now 44
    }
 }

根据我的理解,当国际的"价值"是declared这是已分配的默认值为0(因为是一个int型值和不能是空的。)所以,为什么它是必要的,"法"的修改它的价值呢? </P >

similarly,if"ref"的人可以使用去大学的选择,会有任何需要的是大学initializing"价值"吗? </P >

我的问题是,这是什么样的差分之间的"ref"和"出"的关键词吗?但没有人想站2和2的在一起。 </P >


According to my understanding when the int"value" is declared it is
already assigned a default value of 0 (since int is a value type and
cannot be null.)

不,那不正确。

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

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

Similarly, if"ref" were to be used instead of out, would there be any
need of initializing"value"?

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

1
2
3
4
5
6
7
8
9
10
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
}


有时,从方法中需要返回多个值,因此在这种情况下,可以通过ref和out参数返回这些额外的值。很好地引用了.NET框架中的"typarse"方法,例如"int32.typarse方法"

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

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


必须为变量赋值。但是,您在post中提到的out参数的概念有更多的语义意义。

如果传递out参数,则需要调用的函数分配它。C#编译器简单地强制"优秀的程序员"技能编译时间控制,以获得更好的代码风格。


默认情况下,即使存在默认值,也不会为int赋值…请尝试以下操作:

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

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