鉴于以下示例,客观上比另一个客观更好/更快/更安全吗?对象文字实例化是否应该是实用的最佳实践?
这在哪里不合适?
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 };
}
答案 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会更具可读性。