c# - C# 中的非初始化变量

标签 c# .net variables initialization

我有以下代码:

class Foo
{

    public Foo()
    {
        Bar bar;
        if (null == bar)
        {

        }
    }
}

class Bar { }

代码专家已经看到这会产生错误。 Bar 可能不会在 if 语句之前初始化。

bar 的值是什么?它不应该为空吗?他们不是设置为空吗? (空指针?)

最佳答案

不,局部变量没有默认值1。在你阅读它们之前,它们必须被明确分配。这减少了您使用您认为您已为其赋予合理值的变量的机会,而实际上它具有一些默认值。对于实例变量或静态变量无法做到这一点,因为您不知道调用方法的顺序。

有关明确赋值的更多详细信息,请参阅 C# 3.0 规范的第 5.3 节。

请注意,这与引用类型变量无关。这将无法以相同的方式编译:

int i;
if (i == 0) // Nope, i isn't definitely assigned
{
}

1 就语言而言,无论如何......显然内存中的存储位置有东西,但它是无关紧要的并且是特定于实现的。有一种方法可以找出该值是什么,方法是创建一个带有 out 参数的方法,然后使用 IL 在该方法中查看该参数的值, 没有给它另一个值。 CLR 根本不介意这一点。然后,您可以调用该方法,传入一个未明确分配的变量,您瞧,您可以检测到该值 - 这基本上可能是“全零”值。

我怀疑 CLI 规范确实强制局部变量具有默认值——但我必须检查一下。除非你正在做上面那样的坏事,否则在 C# 中对你来说应该无关紧要。

关于c# - C# 中的非初始化变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2515829/

相关文章:

c# - 用 <p> 段落和 <br/> 标签替换换行符

c# - 无法删除 arraylist 中的项目

c# - 使用 BinaryFormatter 将自动实现的属性更改为正常和反序列化

c# - 关于在 Thread 中传递的局部变量

java - 拦截器的 invocation.invoke() 后未填充 Struts 2 Action 变量

c# - 如何使用 C# 应用程序连接到 telnet 的 tcp 端口 23?

c# - HTML:使用 C# Razor 和模型的复选框

c# - 通过 ServiceStack 加密消息

c# - asp.net特殊标签的区别

vba - 括号阻止函数运行