以下代码片段有什么区别?
Form1 form1 = new Form1();
和
Form1 form1;
public Class1()
{
form1 = new Form1();
}
答案 0 :(得分:4)
在您的具体示例中,没有区别。两者将编译为相同的IL。 这只是一个偏好/风格的问题。
一般来说,不同之处如下:
第一个版本无法访问此类的其他实例成员,第二个版本可以。
答案 1 :(得分:4)
不同之处在于您可以准确控制第二种情况下初始化的时间。
使用内联初始化,您不能依赖于初始化另一个:
int a = 42;
int b = a; // not definitely known to have a value yet
在构造函数中初始化它们时,您可以控制它们运行的顺序:
int a, b;
public Class1() {
a = 42;
b = a;
}
除此之外,没有任何真正的区别。内联初始化将由编译器放置在构造函数中,因为这是唯一可以进行初始化的地方。
答案 2 :(得分:1)
答案 3 :(得分:0)
在第二个选项中,您声明类型为Form1
的引用,该引用不包含任何内容(无对象),直到您使用构造函数中的new
关键字对其进行初始化。在第一个选项中,您可以立即声明并初始化。
答案 4 :(得分:0)
第一个片段的结果是form1将包含类Form1的新实例。
第二个片段不会创建一个新实例,只会创建一个未初始化的变量(它将被初始化为null)。
结合起来将是:
Form1 form1;
public Class1()
{
form1 = new Form1();
}
现在上面的代码片段是类的一部分,当你创建这样一个类的实例时,它将调用Class1,导致将form1分配给Form1的新实例。 E.g:
class Class1
{
Form1 form1;
public Class1()
{
form1 = new Form1();
}
}
c = Class1();
c将调用Class1的构造函数,该构造函数调用新的Form1()并将其分配给form1。
答案 5 :(得分:0)
根据 C#特定语言规范10.11.3 :
将变量初始值设定项转换为赋值语句,并在调用基类实例构造函数之前执行这些赋值语句。此排序可确保在执行有权访问该实例的任何语句之前,所有实例字段均由其变量初始值设定项初始化。
在您的具体示例中,没有示例。但是,如果我们在此规范中运行一个示例:
using System;
class A {
int x = 1;
int y;
public A() {
y = -1;
}
}
当调用新的A()时,x = 1和y = 0(默认值)的输出直到构造函数被执行。