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 };
}
4

4 回答 4

16

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

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

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

转为:

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

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

于 2012-08-15T19:31:45.540 回答
1

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

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

编辑:

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

于 2012-08-15T19:33:26.680 回答
0

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

于 2012-08-15T19:32:18.957 回答
0

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

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

于 2012-08-15T19:34:34.223 回答