Object Literal Instantiation比设置属性更快吗?

时间:2012-08-15 19:30:44

标签: c# design-patterns object instantiation objectinstantiation

鉴于以下示例,客观上比另一个客观更好/更快/更安全吗?对象文字实例化是否应该是实用的最佳实践?

这在哪里不合适?

class Person
{
    public string name;
    public int age;
}
void MakePeople()
{
    Person myPerson = new Person();
    myPerson.name = "Steve";
    myPerson.age = 21;

    Person literalPerson = new Person { name = "John", age = 22 };
}

4 个答案:

答案 0 :(得分:16)

不,它不是更快或更慢。它是一样的。

编译器将对象初始值设定项转换为构造函数调用,然后设置这些属性。

Person literalPerson = new Person { name = "John", age = 22 };

转向:

Person myPerson = new Person();
myPerson.name = "John";
myPerson.age = 22;

您应该使用更具可读性的内容以及您与团队达成的协议。

答案 1 :(得分:1)

两者都是合适的。这取决于您需要做什么来设置属性。例如,在需要一些逻辑来获得属性值的情况下,我会避免文字实例化:

Person myPerson = new Person();
myPerson.SomeProperty = if IsNewPerson ? GetPropertyFromDatabase() : GetDefaultProperty();

修改

在Visual Studio中使用文字对象初始化的一个优点是Intellisense将提示属性,仅显示尚未声明的属性。 (我遇到了在设置属性时冗余分配值的代码。)

答案 2 :(得分:0)

如果你看一下生成的IL,我很确定你会发现它们是相同的。使用对象初始化器只是一个编译器快捷方式。

答案 3 :(得分:0)

我认为速度不应该成为推动这一决定的因素。两种方法的速度可能差别很小。

我认为代码可读性应该是你走哪条路的主要因素。使用这个标准,我认为它们非常接近,这取决于个人偏好或团队决定的任何内容。但是,我认为在需要设置许多属性的对象的情况下,显式调用setter会更具可读性。