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放在一起。
答案 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上的上述链接中找到更多信息。