我想知道 .Net Framework 如何处理声明但未实例化的对象情况。
例如,我声明了一个像
这样的对象DropDownList ddl;
并且什么都不做。我知道我应该对这个变量做些什么并得到关于它的警告,但我不知道的是它将被存储的位置。
是否存在存储所有声明变量数据的查找表?或者是否有每个声明的虚拟参考?
编辑:我只是想知道为这个对象声明分配的内存。
Edit2:无论是否是局部变量,我只是谈论内存分配结构。我想知道这个引用存储在哪里。
答案 0 :(得分:6)
如果ddl
是字段,则ddl
的值将为null
,因为它是引用类型。
任何试图呼叫其成员的企图都会产生NullReferenceException
。
如果它是局部变量,它将被简单地取消分配。
值类型将获得其类型的default(T)
。
编译器本身可以完全删除调用,具体取决于它的声明位置,但这是一个实现细节。
答案 1 :(得分:1)
如果你在谈论一个局部变量,那么编译器可以简单地优化它,因为没有人可以使用它(如果你试图在不初始化编译器的情况下使用它就会产生错误的抗议)。实际上,.NET 4编译器在我刚刚测试时为我做了这个。
如果您正在讨论类中的某个字段,那么它将使用default value for its type作为对象构造的一部分进行初始化。
答案 2 :(得分:1)
从你的描述中,听起来你正在谈论一个局部变量。当你在通常的实现中声明局部变量而没有任何优化时,就会在堆栈上保留空间(最有可能),并以null
引用作为其值。
如果您想进一步检查(我从未使用过它),您可以查看StackFrame
课程。
答案 3 :(得分:1)
变量存储在程序集中。它始终具有默认值null。
在发布模式下(编译器设置为优化),它已经过优化,不会存储在任何地方。
如果您想了解有关IL以及编译器如何工作的更多信息,wikipedia有一篇很好的文章可以开始。
答案 4 :(得分:1)
所有变量都存储在类或方法中。可以使用 .NET Reflection :
列出声明为类的变量class Class1 { private int i; public string s; }
typeof(Class1).GetFields(BindingFlags.Instance); // returns all instance fields
typeof(Class1).GetFields(); // returns all instance public fields
typeof(Class1).GetProperties(); // returns all instance public properties
无法使用.NET反射机制检查声明到方法中的变量。