2015-02-05 32 views
1
//Consider this declaration 
string name; 

这里字符串变量是一个未赋值的变量,这是否申报储备任何内存,如果它不初始化?内存在C#中未分配的变量

+7

如果没有在任何地方使用它,它可能会被编译器 – 2015-02-05 14:42:17

+0

剥离,这通常是声明变量的原因,但如果从未使用它,编译器可能会优化它。 – DLeh 2015-02-05 14:42:34

+1

它是一个类字段或局部变量?根据您使用代码的地方,答案是不同的。 – 2015-02-05 14:43:27

回答

3

它不是未分配的。所有的类/结构都会收到它们的默认值。对于一个字符串,它是null

如果它是一个局部变量,那么优化将倾向于将其删除。如果它的一个实例变量,然后将分配内存(我认为,C#规范不清楚)。

+0

为什么你说“它不是未分配的”。如果它是一个局部变量,并且如果我尝试对名称做任何操作,编译器将显示“使用未分配的变量”。 – 2015-02-05 15:07:17

+0

@ShamseerKSmr它的错误是完全正确的;你不能使用未分配的变量。您需要首先为其分配一个值。 – Servy 2015-02-05 15:20:26

-1

方法的局部变量不保留任何内存,寄存器分配给它取决于它如何使用以及如何使用其他变量。只要它没有被使用,就没有寄存器被分配给它。

在一个方法中可以有大量的变量,但是CPU中的寄存器数量有限,所以编译器会优化您的代码以重新使用寄存器。有关更多信息,请参见Register allocation

不,string name;不是保留任何内存。

+0

局部变量*可能被注册,并且它们可能不是。说当地人从不消费记忆是非常错误的。事实上,在大多数程序中,相当大比例的局部变量最终在内存中花费至少*一些*时间。 – Servy 2015-02-05 15:23:50

+0

他们不*保留*任何记忆(暗示他们什么时候不使用)。 – Guillaume 2015-02-05 15:44:24

+0

堆栈空间将被分配给本地变量,这将最终预留内存。如果编译器优化它,因为它没有被使用,那么在运行时就不会存在变量(甚至不是寄存器)。 – Servy 2015-02-05 15:46:52