C# 当您声明一个没有实例的对象时.Net会做什么?

C# 当您声明一个没有实例的对象时.Net会做什么?,c#,.net,object,memory-management,C#,.net,Object,Memory Management,我想知道.netframework如何处理已声明但未实例化的对象情况 例如,我声明一个对象,如 DropDownList ddl; 什么都不要做。我知道我应该对这个变量做些什么,并得到一个关于它的警告,但我不知道它将存储在哪里 是否存在存储所有声明变量数据的查找表?还是每个声明都有一个虚拟引用 编辑:我只是想知道内存是如何分配给这个对象声明的 Edit2:不管它是否是局部变量,我只是在谈论内存分配结构。我想知道这个引用存储在哪里。如果ddl是一个字段,那么ddl的值将是null,因为它是一个引

我想知道.netframework如何处理已声明但未实例化的对象情况

例如,我声明一个对象,如

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-一个字段可以很好地编译。