当我使用没有值的变量值通过引用调用来调用函数时,为什么会出现错误?

Ali*_*adi 1 c# function pass-by-reference

int x;
Method3(ref x);
Console.WriteLine("x is : {0}", x);
Console.ReadKey();

static void Method3(ref int a)
{
    a += 100;
}
Run Code Online (Sandbox Code Playgroud)

我面临这个错误!“错误 CS0165 使用未分配的局部变量‘x’”

使用该内存位置将值加到 100

Mar*_*ell 6

您期望结果是什么?为什么?如果不知道 的初始值x,这将产生未定义的行为。当地人对它们的初始值有复杂的规则。在 IL 中,堆栈帧是否清零是可选的(并且可以通过 C# 中的属性进行配置)。为了避免此问题,C# 使用“明确赋值”规则来强制调用者在观察该值之前已为局部变量定义了该值。所以:给x一个值!也许为零。然后你可以加 100 并理解答案。

int x = 0;
Run Code Online (Sandbox Code Playgroud)

这与fields不同,因为 fields 隐含了零/空默认值。


注意:如果您确实想要查看堆栈上的垃圾,可以抑制此操作。为此,您需要添加[SkipLocalsInit]到方法中,并替换int x;Unsafe.SkipInit(out int x);(这是一个被 JIT 删除的无操作方法,但它满足 C# 的明确赋值规则)。不过,我认为在这里这样做没有任何好处!这些修饰符适用于远远超出正常语言使用范围的非常具体的性能关键场景,并且它们理解任何副作用都是您的问题。