2011-03-01 57 views
4

嗨 我在想,如果有初始化对象之间这样不同类型的对象初始化的

MyClass calass = new MyClass() 
{ 
    firstProperty = "text", 
    secondProperty = "text" 
} 

和initializaing对象这样

MyClass calass = new MyClass // no brackets 
{ 
    firstProperty = "text", 
    secondProperty = "text" 
} 

任何区别,我也想知道是什么名字这种初始化

回答

8

不,绝对没有区别。在这两种情况下,您都使用对象初始值设定表达式。对象初始化在C#3

在这两种情况进行了介绍,这是完全等同于:

// tmp is a hidden variable, effectively. You don't get to see it. 
MyClass tmp = new MyClass(); 
tmp.firstProperty = "text"; 
tmp.secondProperty = "text"; 

// This is your "real" variable 
MyClass calass = tmp; 

注意如何分配给calass只发生属性已分配 - 就像你” d期望来自源代码。 (在某些情况下,我相信C#编译器可以有效地删除多余的变量并重新排列赋值,但它必须显着表现得像这样的翻译。如果您要重新分配现有变量,它肯定会有所作用。)

编辑:关于省略构造函数参数的微妙点。如果你这样做,它总是相当于包含一个空的参数列表 - 但这是而不是就等于调用无参数构造函数。例如,可以有可选的参数或参数阵列:

using System; 
class Test 
{ 
    int y; 

    Test(int x = 0) 
    { 
     Console.WriteLine(x); 
    } 

    static void Main() 
    { 
     // This is still okay, even though there's no geniune parameterless 
     // constructor 
     Test t = new Test 
     { 
      y = 10 
     }; 
    } 
} 
+0

你能告诉我,如果我使用初始化表达式的默认构造函数将被调用? – Berial 2011-03-01 23:07:23

+0

@Berial:它们都是对象初始化表达式 - 但是,如果你没有为构造函数指定参数列表,就好像你指定了一个空的参数列表。 – 2011-03-01 23:08:17

2

没有。事实上,ReSharper会抱怨说带有初始值的无参数构造函数的括号是多余的。如果你使用带有一个或多个参数的构造函数,你会(显然)仍然需要它们,但是因为这不是这种情况,所以只需删除它们。