在C#中构造对象的首选方法是什么?构造函数参数或属性?

Pet*_*rdk 27 c# oop constructor properties

我想知道,在C#中构造新对象的首选方法是什么?

参加一个Person课程:

public class Person 
{
    private string name;
    private int age;

    //Omitted..
}
Run Code Online (Sandbox Code Playgroud)

我应该创建它来使用:

New Person("name", 24);
Run Code Online (Sandbox Code Playgroud)

要么

New Person() { Name = "name", Age = 24 };
Run Code Online (Sandbox Code Playgroud)

这只是一个品味的问题,还是有充分的理由使用一个而不是另一个?

我可以想象一个人应该只使用构造函数中的必需字段和可选字段而不是构造函数参数,而是使用属性.

我是对的吗?

Jef*_*tes 40

首选方式取决于您的设计.

构造函数属性用于对象需要的项目才能正确构造.也就是说,对象在初始化时应具有的任何属性都需要在构造函数中(除非您创建工厂或构建器模式,否则在调用构造函数之后通常不需要部分初始化对象)构造函数除了工厂/构建器之外都是隐藏的.

属性初始化器最适合在特定用例所需的构造函数之后进行其他配置,但对象不需要初始化.

例如,您可以拥有一个代表一个人的对象.一个人需要初始化名称和年龄,但他们所居住的地址是可选配置.因此,名称和年龄是构造函数参数,地址是读/写属性.

Person johnDoe = new Person("John Doe", 24) { Address = "42 Adams Street" };
Run Code Online (Sandbox Code Playgroud)


Mar*_*ell 12

这实际上取决于场景.属性方法有很多方便,因为您不必在构造函数中复制赋值.此外,大多数数据绑定方案喜欢能够创建新对象,他们通常使用无参数构造函数,因此这是一个很大的优势.

但是,对于不可变类型,构造函数方法是唯一明智的选择.有趣的是(也许)C#4.0中的命名/可选参数允许类似于不可变类型的对象初始化器 - 见这里.

构造函数方法对于Inversion of Control框架也非常流行,因为它明确地宣传了该类所需的功能.

您可能需要混合和匹配,但通常比构造函数样式更具属性风格.

  • 是 - 只读字段只能由构造函数代码设置. (2认同)

Bar*_*Dog 7

我总是在你应该将值传递给构造函数的基础上工作,这对于该对象必须存在于有效状态.

在你的例子中,你可以说没有年龄的新人不能存在,所以应该传递给构造函数.

如果您的工作基于对象应该为实际工作实体建模,那么确定使任何对象有效所需的最小值 - 无论您将它们设置为默认值还是通过构造函数传递值.


Fre*_*els 5

在构造函数中设置值会使这些属性成为必需属性,因此这意味着您无法在不设置这些属性的情况下创建新实例.在某些情况下,这是优选的,在其他情况下,这是不可预见的.