不同类型的对象初始化的
问题描述:
嗨 我在想,如果有初始化对象之间这样不同类型的对象初始化的
MyClass calass = new MyClass()
{
firstProperty = "text",
secondProperty = "text"
}
和initializaing对象这样
MyClass calass = new MyClass // no brackets
{
firstProperty = "text",
secondProperty = "text"
}
任何区别,我也想知道是什么名字这种初始化
答
不,绝对没有区别。在这两种情况下,您都使用对象初始值设定表达式。对象初始化在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
};
}
}
答
没有。事实上,ReSharper会抱怨说带有初始值的无参数构造函数的括号是多余的。如果你使用带有一个或多个参数的构造函数,你会(显然)仍然需要它们,但是因为这不是这种情况,所以只需删除它们。
你能告诉我,如果我使用初始化表达式的默认构造函数将被调用? – Berial 2011-03-01 23:07:23
@Berial:它们都是对象初始化表达式 - 但是,如果你没有为构造函数指定参数列表,就好像你指定了一个空的参数列表。 – 2011-03-01 23:08:17