2010-09-23 56 views
1

在本书中,我发现了以下(翻译):C#变量初始化VS分配

初始化指在申报时分配变量的值。 int X=5被称为初始化命令。

编辑:它只是说,只有当你在声明时赋值项初始化时使用。如果你以后这样做,它的正义分配(根据它 - 我不这么认为,这就是为什么我问)。这是真的还是不?

嗯,我一直认为(并根据网络上的其他人)初始化的一个值的变量的第一次赋值条款。我认为int X=5只是作为声明的一部分。

我试图在MSDN上搜索没有运气。感谢您的任何信息。

+0

目前尚不清楚你在说什么显着差异。你能详细说明一下吗? – 2010-09-23 15:02:44

+2

你能说清楚你在这里问什么吗?实际上你没有在你的帖子中提过一个问题。 – Oded 2010-09-23 15:03:00

回答

5

如果你所问的只是术语(*这不是你的问题真的很清楚),那么变量的“初始化”实际上是第一次给它赋值。这个术语来自于您将变量赋予“初始”值的事实。

这应该(显然)在第一次使用之前发生。

int x=5; 

是一个声明和初始化,并且是

int x; 
x=5; 
+1

是的,我认为是。在这方面,如果说初始化只是在声明时使用,那么这本书是错误的。 – Thomas 2010-09-23 15:06:34

0

在一般情况下,其实只是方便的速记初始化,如果第一次的变量被分配到,无论是明确的程序或隐式编译器/运行时。然而,初始化机制对于理解特别是在处理类时尤为重要。考虑下面的简单例子(在某处创建'Bar'的实例)以查看编译器如何执行初始化过程。您会注意到这些字段是在初始化时声明的,并且在构造函数有机会设置它们之前,所有字段都被“初始化”。

public class barBaseBase 
{ 
    protected int x = 5; 
    public barBaseBase() 
    { 
     x = 4; 
    } 
} 

public class barBase : barBaseBase 
{ 
    protected int y = 4; 
    public barBase() 
    { 
     x = 3; 
     y = 2; 
    } 
} 

public class Bar : barBase 
{ 
    protected int z = 3; 
    public Bar() 
    { 
     x = 2; 
     y = 1; 
     z = 0; 
    } 
} 
3

通常,初始化变量是声明后的第一次赋值,因为变量不会自动初始化。后续任务只是任务。

void foo() { 
    int i;//not initialized. 
} 

不包括fields,它们是在类或结构中声明的变量。在调用该对象实例的构造函数之前,它们被初始化为default values。因此,即使您(首先)在构造函数中为某个字段分配了某些内容,并且该字段未在声明中初始化,但严格来说就是赋值而不是初始化。没有进入这样的细节,我想很多程序员确实将构造函数中的一个字段的第一次赋值当作初始化,并且可能在它们的对话中使用它。可能这种用法/习惯源于使用非托管语言,如C/C++,其中变量在首次声明时包含乱码,因此它们必须用非垃圾值(初始化)填充它。

class A { 
    int x;//not initialized 
    int y = 1;//initialized here 
    A() { 
     x = 1;//strictly speaking, not initialization, just assignment. 
     y = 2;//was obviously initialized above 
    } 
} 

对于程序员不写编译器或语言,能够与其他程序员进行有效的沟通比会意字初始化确切的术语更重要。因此,请继续使用它,意思是你身边的每个人都能理解。尽管解释确切的含义不会错(但我可能不会因为害怕暴露我的迂腐倾向)。

就我个人而言,我会避免使用术语“初始化命令”作为变量的书。

0

请注意,初始化字段会导致C#编译器为每个构造函数发出初始化IL指令。所以如果你有多个构造函数,你将会重复初始化IL - 即不必要的代码膨胀。

更好地初始化默认构造函数中的变量,并让其他构造函数调用它。