【问题标题】:Why does it give an error when I call a function as a call by reference with a variable value that has no value?为什么当我使用没有值的变量值通过引用调用函数时会报错?
【发布时间】:2023-02-25 19:20:37
【问题描述】:
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# function pass-by-reference


【解决方案1】:

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

int x = 0;

这不同于字段,因为字段隐含了零/空默认值。


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 2023-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多