2013-05-28 102 views
3

以下代码片段之间有什么区别?声明实例差异

Form1 form1 = new Form1(); 

Form1 form1; 

public Class1() 
{ 
    form1 = new Form1(); 
} 
+5

前者是内联初始化,后者是构造函数中的初始化。请参见:[最佳实践:在构造函数或声明中初始化类字段?](http://stackoverflow.com/questions/24551/best-practice-initialize-class-fields-in-constructor-or-at-declaration) –

+2

只要初始化发生在变量被使用之前,实际上没有太大的区别。但是,在声明中初始化时,确保在初始化之前不能尝试使用该对象。 – tinstaafl

回答

4

在你的具体的例子,没有任何区别。两者都将被编译为相同的IL。 这只是一个偏好/风格的问题。

一般来说,所不同的是以下内容:

第一个版本不能访问此类,第二版罐的其他实例成员。

1

在第一个中,您只是在类中初始化变量,然后在第二个中初始化构造函数中的变量。

这两者几乎没有任何性能折衷。 除了语义上的简单性,它的选择,以及你的前进方向。

阅读更here

0

在声明Form1类型的引用,直到您在构造函数中使用new关键字inialize它不包含任何东西(没有对象),第二个选项。在第一个选项中,您立即声明并初始化。

4

不同之处在于,您可以精确控制第二种情况下初始化发生的时间。

有了这种内联初始化,你不能依赖于一个初始化另:

int a = 42; 
int b = a; // not definitely known to have a value yet 

当你在构造函数初始化它们,你有过为了控制它们运行:

int a, b; 

public Class1() { 
    a = 42; 
    b = a; 
} 

除此之外,没有任何真正的区别。内联初始化将由编译器放置在构造函数中,因为这是可以完成这种初始化的唯一位置。

0

第一个片段的结果是form1将包含类Form1的新实例。

第二个片段不会创建一个新的实例,只会有一个未初始化的变量(它会被初始化为null)。

结合这将是:

Form1 form1; 

public Class1() 
{ 
    form1 = new Form1(); 
}   

现在代码fragement上面是一个类的一部分,当你创建一个这样的类的实例,它会调用Class1的,导致在Form1被分配到一个新的实例的Form1。例如:

class Class1 
{ 
    Form1 form1; 

    public Class1() 
    { 
     form1 = new Form1(); 
    }   
} 

c = Class1(); 

c将调用Class1的构造函数,该函数调用新的Form1()并将其分配给form1。

0

根据的C#特定语言规范10.11。3

变量初始化器转换为赋值语句,这些赋值语句在调用基类实例构造函数之前执行。这种排序确保所有实例字段在执行任何有权访问该实例的语句之前由其变量初始化器初始化。

在你的具体例子中,没有例子。然而,如果我们在这里本说明书中运行的一个示例:

using System; 

class A { 
    int x = 1; 
    int y; 
    public A() { 
     y = -1; 
    } 
} 

当新A()被调用的出把x = 1且y = 0的(缺省值),直到构造被执行。