对象字面量实例化比设置属性更快吗?

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代码应该是相同的。所以,不需要。 - Phillip Schmidt
2
一行代码代替三行,更清晰地表达意图和效果。即使速度慢10倍,这仍然是一个好主意。我无法理解人们对微小性能差异的固执追求(作为默认方法;我很乐意对热点进行微观优化)。 - user395760
4个回答

16

不,它既不更快也不更慢,它是一样的。

编译器将对象初始化程序转换为构造函数调用,随后设置这些属性。

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

转换为:

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

你应该使用更易读且与团队协商一致的方式。


2
在编程方面,将以下内容从英语翻译成中文。仅返回翻译后的文本:+1 表示使用更易读的内容(尤其是对于团队环境)。 - JYelton
5
从技术上讲,这并不完全相同,因为编译器会声明一个临时变量来保持对你的变量进行原子赋值。 - Kirk Woll
@KirkWoll即使在Person是引用类型的情况下,这也是真的吗? - Jeppe Stig Nielsen
@Jeppe,是的,在这里看。(查看 PointRectangle 的示例,并注意它们被定义为一个 class)。 - Kirk Woll
1
@Jeppe,是的,这是一个常见的误解。请参阅此答案进行全面阐述(答案#2来自Lippert)。 - Kirk Woll
显示剩余2条评论

1

两种方法都可以。这取决于您需要如何设置属性。例如,在需要一些逻辑来得出属性值的情况下,我会避免使用字面实例化:

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

编辑:

在Visual Studio中使用字面对象初始化的一个优点是Intellisense会提示属性,仅显示尚未声明的属性。(我曾遇到过代码,在设置属性时一个值被多次赋值的情况。)


1
这只是个人偏好而已。你仍然可以使用字面初始化来实现。 - Servy
你可以这样做,但可读性会大大降低。 - JYelton
可读性是个人偏好的问题。我的观点并不是这样做不好,仅仅是生成的代码在你的例子中仍然是相同的。 - Servy
我认为可读性是一种要求,而不是偏好;至少在某些工作场所是如此。但你说得对,IL 是相同的。 - JYelton
1
我并没有说让你的代码可读性是一种偏好,我是在说更易读是一种偏好。有些人发现某些代码片段很容易阅读,而其他人则发现它很难。此外,请注意,当您具有复杂的赋值或许多属性时,向对象初始化添加换行符/空格是很常见的,此时您真正删除的只是反复出现的冗余变量名称。这是我经常遵循的模式。 - Servy

0

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


0

我认为速度不应该驱动这个决定。两种方法的速度可能相差不大。

我认为代码可读性应该是你选择哪种方式的主要因素。按照这一标准,我认为它们非常接近,最终取决于个人喜好或团队决定。然而,在需要设置许多属性的对象的情况下,显式调用Setter更容易阅读。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接