c# - 为什么 C# 预先绑定(bind)局部变量?

标签 c# .net clr

<分区>

所以在 C# 中,您可能有以下代码:

void DoSomething()
{
    //some code.
    int x = 5;
    //some more code.
}

一旦您输入 DoSomething,CLR 就会为 int x 设置空间。为什么它不等到它到达上面有 int x =5 的那一行?特别是即使 x 是绑定(bind)的,它也不会让你实际使用它,直到到达那条线为止?

最佳答案

As soon as you enter DoSomething, the CLR sets up space for int x. Why does it not wait until it reaches the line with int x = 5 on it?

该问题无法回答,因为整个问题都建立在错误的前提之上。局部变量的存储空间可能是:

  • 在第一次进入方法时分配
  • 当控制到达声明时分配
  • 在控制到达初始化时分配(假设初始化和声明不同)
  • 在特殊情况下分配——例如,如果本地是 lambda 的封闭本地、迭代器 block 或异步 block 中,本地存储的分配方式和时间可能会变得复杂
  • 完全省略;如果本地从未使用过,那么它可能不会首先分配。

C# 编译器和 jit 编译器肯定会确保以正确的方式分配本地存储,并尝试确保其高效。他们如何选择这样做取决于具体情况。预先分配空间可能更有效,并且仅在变量被使用时才分配它可能更有效;在选择局部变量的生命周期时,允许抖动有很大的自由度。如果抖动可以在不违反程序正确性的情况下这样做,则允许局部变量的生存时间比它们的范围所暗示的更长或更短。

由于问题的前提不正确,所以问题没有答案。问一个更好的问题。

关于c# - 为什么 C# 预先绑定(bind)局部变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9105377/

相关文章:

c# - 如何检查实体是否是 foreach 循环的第一个元素

c# - 使用 C# 的 SQL 中的表

c++ - 声明后在数组中分配多个值

c# - 函数覆盖不调用

c# - 使用 XmlSerializer 反序列化 XML 的替代方法

c# - 带有 Windows 通用应用程序的 Active Directory 身份验证库

c# - 尝试让一个对象查看 Unity 中的另一个对象

c# - 如何查看在asp.net应用程序中引发的原始错误

c# - 从方法返回并作为参数传递时,结构的预期生命周期是多少?

c# - 是否可以在 C# 中使用分支预测提示?