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

Why does it give an error when I call a function as a call by reference with a variable value that has no value?

提问人:Alireza Asadi 提问时间:2/25/2023 最后编辑:Marc GravellAlireza Asadi 更新时间:2/25/2023 访问量:49

问:

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

static void Method3(ref int a)
{
    a += 100;
}

我遇到这个错误!“错误 CS0165 使用未分配的局部变量 'x' ”

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

C# 函数 按引用传递

评论

1赞 Marc Gravell 2/25/2023
提示:始终将代码显示为文本;图像无法访问(想想:屏幕阅读器软件),并且无法复制/粘贴以使用
0赞 Fildor 2/25/2023
您面临此错误是因为您正在完全按照错误所说的操作。如果我告诉你“加 100”——你不会问“加什么”吗?

答:

6赞 Marc Gravell 2/25/2023 #1

你预计结果会是什么,为什么?如果不知道 的初始值,这将具有未定义的行为。当地人有...围绕其初始值的复杂规则。在 IL 中,堆栈帧是否为零是可选的(可以通过 C# 中的属性进行配置)。为了避免此问题,C# 使用“确定赋值”规则强制调用方在观察到局部变量值之前已为该值定义该值。所以:给一个值!也许是零。然后你可以加 100 并理解答案。xx

int x = 0;

这与字段不同,因为字段具有隐含的零/空默认值。


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