out
变量引用可以使用未分配变量的地址进行初始化,但ref
变量无法做到这一点,使out
优于ref
。那么ref
需要什么?
答案 0 :(得分:4)
正如你所说,你知道差异,因此我假设你也知道必须分配out参数。
因此,我相信你想知道为什么需要分配一个out论据。
out关键字 - 这意味着您正在使用此参数来输出内容。
考虑,int add(int x,inty)。如果此方法不会返回任何内容,那么它是否有效。这里我们也声明了一个这个方法返回整数的契约。类似地,在out关键字的情况下,我们定义一个合同,将分配out变量并将作为输出提供。
为什么我们需要更新? 这是因为我们明确地将其标记为out参数,因此我们确信我们将分配一个值并将其返回。如果有一些情况我们没有任何东西要分配,我们仍在使用论证,那么我很确定我们有设计问题。
ref关键字: - 表示您正在传递参考。它绝不意味着您将分配它并提供一些输出。你可以这样使用它,但它不是合同。你有一个参数的参考,你可以用它做任何事情。在C#中,默认情况下会按值传递参数。 ref Keyword为您提供了一种通过引用传递参数的方法。
您可以获得有关ref关键字here的更多信息。
希望这会有所帮助。
答案 1 :(得分:1)
问题是因为out参数必须在函数结束之前初始化或分配。这基本上是你不要忘记设置变量。
static void Method(out int pointer)
{
pointer = 5; //Initialize or assign to fix the error
}
答案 2 :(得分:1)
我的理解是out参数是由被调用的方法设置的,而不是传递给方法。
所以这些都是有效的:
class Program
{
static void Main(string[] args)
{
int integer;
Method(out integer);
// integer is now 9
}
static void Method(out int pointer)
{
...
pointer = 9;
}
}
// Option 2:
class Program
{
static void Main(string[] args)
{
int integer = 9;
Method(integer);
}
static void Method(int pointer)
{
//Do something with pointer = 9
}
}
答案 3 :(得分:1)
如果您想通过引用将参数传递给函数,则应使用ref
:
class Program
{
static void Main(string[] args)
{
int integer = 9;
Method(ref integer);
}
static void Method(ref int pointer)
{
}
}
这将正常编译。