9

给出下面的例子,客观上比另一个更好/更快/更安全吗?对象字面实例化应该是一个最实际的实践吗?对象文字实例化比设置属性更快吗?

这不合适吗?

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 }; 
} 
+3

从这两种方法生成的IL应该是相同的。所以不行。 – 2012-08-15 19:32:23

+2

一条线而不是三条,意图和效果更清晰。它可能慢10倍,它仍然是一个好主意。我无法理解人们对微小性能差异的注意(作为默认方法;我很乐意微观优化热点)。 – delnan 2012-08-15 19:33:38

回答

16

不,它不会更快或更慢。这是相同的。

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

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

打开到:

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

你应该使用什么是更具可读性和你有什么与你的团队达成一致。

+2

+1使用什么更可读(尤其是团队环境) – JYelton 2012-08-15 19:36:43

+5

从技术上讲,它不完全相同,因为编译器声明一个临时变量,以保留赋值给您的变量原子。 – 2012-08-15 19:37:20

+0

@KirkWoll即使在'Person'是一个引用类型的上述情况下,情况是否如此? – 2012-08-15 19:44:36

0

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

1

两者都适用。这取决于你需要做什么来设置属性。例如,我会避免在案件字面实例,其中需要一些逻辑,在属性值到达:

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

编辑:

一个优点在Visual Studio中使用文本对象的初始化是智能感知将提示属性,只显示尚未声明的属性。 (我已经跑到代码中,在设置属性时值被重复分配)。

+1

虽然这只是个人偏好。你仍然可以使用文字初始化。 – Servy 2012-08-15 19:34:12

+0

你可能会得到更少的可读性。 – JYelton 2012-08-15 19:34:24

+0

可读性是一个偏好问题。我的观点并不是这是坏的,只是生成的代码仍然是相同的,即使在你的例子中。 – Servy 2012-08-15 19:34:57

0

我不认为速度应该是推动这个决定的原因。两种方法的速度之间可能差别很小。

我认为代码的可读性应该是你走哪条路的主要因素。使用这个标准,我认为他们非常接近,并且归结为个人偏好或任何你的团队决定。然而,我认为在一个对象的情况下需要设置许多属性,明确地调用setter更具可读性。