C# 当您声明一个没有实例的对象时.Net会做什么?
我想知道.netframework如何处理已声明但未实例化的对象情况 例如,我声明一个对象,如C# 当您声明一个没有实例的对象时.Net会做什么?,c#,.net,object,memory-management,C#,.net,Object,Memory Management,我想知道.netframework如何处理已声明但未实例化的对象情况 例如,我声明一个对象,如 DropDownList ddl; 什么都不要做。我知道我应该对这个变量做些什么,并得到一个关于它的警告,但我不知道它将存储在哪里 是否存在存储所有声明变量数据的查找表?还是每个声明都有一个虚拟引用 编辑:我只是想知道内存是如何分配给这个对象声明的 Edit2:不管它是否是局部变量,我只是在谈论内存分配结构。我想知道这个引用存储在哪里。如果ddl是一个字段,那么ddl的值将是null,因为它是一个引
DropDownList ddl;
什么都不要做。我知道我应该对这个变量做些什么,并得到一个关于它的警告,但我不知道它将存储在哪里
是否存在存储所有声明变量数据的查找表?还是每个声明都有一个虚拟引用
编辑:我只是想知道内存是如何分配给这个对象声明的
Edit2:不管它是否是局部变量,我只是在谈论内存分配结构。我想知道这个引用存储在哪里。如果
ddl
是一个字段,那么ddl
的值将是null
,因为它是一个引用类型
任何试图在其上调用成员的行为都将导致失败
如果它是一个局部变量,它将被取消赋值
值类型将获得其类型的默认值(T)
编译器本身可能会完全删除调用,具体取决于调用的声明位置,但这是一个实现细节。如果您谈论的是局部变量,那么编译器可以简单地优化它,使其不存在,因为没有人可以使用它(如果您试图在不初始化编译器的情况下使用它,编译器会以一个错误进行抗议)。事实上,当我刚才测试时,.NET4编译器为我做了这件事
如果您谈论的是类中的字段,那么作为对象构造的一部分,它将使用初始化。从您的描述中,听起来像是在谈论局部变量。当您在通常的实现中声明局部变量且未进行任何优化时,则会在堆栈上为其保留空间(很可能),其值为
null
引用
如果要进一步检查(我从未使用过),可以查看
StackFrame
类。变量存储在程序集中。它的默认值始终为null
在发布模式下(编译器设置为优化),它被优化,并且不会存储在任何地方
如果您想了解更多关于IL和编译器工作原理的信息,请从一篇好文章开始。所有变量都存储到类或方法中。可以使用列出声明到类中的变量。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反射机制检查。您是在谈论变量(如在方法中)还是字段(如在类中)?我试图将两者都指出来。您不声明对象。您声明变量。别忘了值类型。这不是更像
默认值(t)
?如果它是类中的一个字段,它肯定不会被删除。@asawyer-DropDownList
不是一个值类型;)@Oded这只是一个例子,问题是关于已声明但未实例化的对象情况,我认为他没有考虑ref/val语义@Jon-一个字段可以很好地编译。