2015-04-14 27 views
1

msdn documentation on out说,作为输出传递的参数必须在函数内分配一个值。从该网站举例:参考和输出值类型变量

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

根据当INT“价值”的声明是我的理解是已分配的默认值为0(因为int是一个值类型,不能为null)那么,为什么它是否需要“方法”修改其值?

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

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

回答

4

根据我的理解,当INT“价值”的声明是 已分配的默认值为0(因为int是一个值类型, 不能为空。)

没有,这是不正确的。

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

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

同样,如果使用“ref”而不是out,是否会有任何 需要初始化“value”?

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

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 
} 
+0

我不认为有任何‘垃圾’值。'int'将被分配的缺省值'0',并且当一个变量只被声明时,它是未赋值的。在.Net中没有像C,C++这样的垃圾值的概念。 – CriketerOnSO

+0

'out'只指定方法**将**修改参数的值。即使该参数被分配了一些“非垃圾”值。 – CriketerOnSO

0

的int未分配默认值,即使有一个默认值...试试这个:

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

的输出参数的契约是:该方法是保证分配一个值它。参考参数的合同没有这样的保证。

0

必须赋值给变量。但是,在后面提到的out参数的概念具有更多的语义含义。

如果您通过out参数,您期望您调用的函数必须分配它。 C#编译器只是强制“良好的程序员”技能来编译时间控制,以获得更好的代码风格。