Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 类设计-带公共setter的构造函数或属性_C#_.net - Fatal编程技术网

C# 类设计-带公共setter的构造函数或属性

C# 类设计-带公共setter的构造函数或属性,c#,.net,C#,.net,非常简单的问题,假设我有一个具有20个引用类型属性的类,我知道这些属性只会在类创建时/在类创建后立即设置,并且没有任何属性是真正必需的 在这种情况下,最佳做法是创建一个接受20个属性的ctor(因为它们都是引用类型,如果您愿意,仍然允许您传递null),并确保我的所有属性都没有setter 或者 根本就没有一个ctor,只为我的所有属性提供一个setter 我倾向于后者,因为易于实现和(可以说)更干净的代码,尽管这并不能保证对象的不变性,但这些类只在内部使用,我知道我无论如何都不会更改它们 编辑

非常简单的问题,假设我有一个具有20个引用类型属性的类,我知道这些属性只会在类创建时/在类创建后立即设置,并且没有任何属性是真正必需的

在这种情况下,最佳做法是创建一个接受20个属性的
ctor
(因为它们都是引用类型,如果您愿意,仍然允许您传递
null
),并确保我的所有属性都没有
setter

或者

根本就没有一个
ctor
,只为我的所有属性提供一个
setter

我倾向于后者,因为易于实现和(可以说)更干净的代码,尽管这并不能保证对象的不变性,但这些类只在内部使用,我知道我无论如何都不会更改它们

编辑

如果你打算投票结束这个问题,至少要有礼貌地解释为什么你认为这个问题对于ohh这么高的标准来说“不够好”


如果这不是一个属于这里的问题,我真的不知道这是什么意思。

如果所有这些属性都不是强制性的,也不必是只读的,那么就不需要构造函数了。没有人希望调用一个包含20个参数的构造函数,尤其是在不需要这些参数的情况下


因此,即使这个问题是主观的,也可以使用属性并省略构造函数。

如果所有这些属性都不是强制性的,并且它们不必是只读的,那么就不需要构造函数。没有人希望调用一个包含20个参数的构造函数,尤其是在不需要这些参数的情况下


因此,即使这个问题倾向于主观,也要使用属性并省略构造函数。

这看起来像是违反了单一责任原则。建议在包括构造函数的方法中使用0-3个参数。

看起来像是违反了单一责任原则。建议在包括构造函数的方法中使用0-3个参数。

您应该将它们设置为属性,并使用对象初始值设定项:

class Cat
{
    // Auto-implemented properties.
    public int Age { get; set; }
    public string Name { get; set; }
    public object OtherProperty { get; set; }
}

Cat cat = new Cat { Age = 10, Name = "Fluffy" };
这为您提供了简洁的代码,而不必指定不需要的属性。即使指定了所有属性,也不会太长


如果属性是必需的,或者基于某种源对象(如数据行或文件),我会使用构造函数。

您应该将它们设置为属性,并使用对象初始值设定项:

class Cat
{
    // Auto-implemented properties.
    public int Age { get; set; }
    public string Name { get; set; }
    public object OtherProperty { get; set; }
}

Cat cat = new Cat { Age = 10, Name = "Fluffy" };
这为您提供了简洁的代码,而不必指定不需要的属性。即使指定了所有属性,也不会太长


如果属性是必需的,或者基于某种源对象(如数据行或文件),我会使用构造函数。

您以前见过具有20个参数的构造函数吗?就我的一生而言,我不记得见过一个。这真的没有道理,而且似乎是错误的做法。@将军,你是说因为我以前从未见过这样的人,所以没有任何合理的理由来证明拥有这样的人是正确的吗?这要看情况了。这些参数在语义上相关吗?如果是这样,您可能希望让对象
Foo
公开一个接受
FooSettings
对象的构造函数,该对象包含这些值。如果没有,并且对象在没有它们的情况下是有效的,则将它们保留为属性,例如,像UI控件通常那样。在任何情况下,一个20参数的构造函数都是确保没有人想使用你的对象的好方法。最后是一个Parameters类,该类有20个可变属性,这些属性由集合初始值设定项设置,然后传递给原始方法。现在没有人“知道”你的构造函数接受了20个参数。实际上,我认为猜测20个参数或必须插入15个空值才能使用5个参数更为复杂(至少在视觉上)。不管怎样,我投了反对票。你以前见过一个有20个参数的构造函数吗?就我的一生而言,我不记得见过一个。这真的没有道理,而且似乎是错误的做法。@将军,你是说因为我以前从未见过这样的人,所以没有任何合理的理由来证明拥有这样的人是正确的吗?这要看情况了。这些参数在语义上相关吗?如果是这样,您可能希望让对象
Foo
公开一个接受
FooSettings
对象的构造函数,该对象包含这些值。如果没有,并且对象在没有它们的情况下是有效的,则将它们保留为属性,例如,像UI控件通常那样。在任何情况下,一个20参数的构造函数都是确保没有人想使用你的对象的好方法。最后是一个Parameters类,该类有20个可变属性,这些属性由集合初始值设定项设置,然后传递给原始方法。现在没有人“知道”你的构造函数接受了20个参数。实际上,我认为猜测20个参数或必须插入15个空值才能使用5个参数更为复杂(至少在视觉上)。不管怎样,我现在投赞成票。虽然我同意这一点,但这确实意味着,如果没有一个向量,对象不是不变的。并不是说我个人很关心不可变性,而是很多人会不惜一切代价为确保你的对象是不可变的而争论。@cogumel0如果你想让它不可变,那么就使用一个构建器并传递它“所以即使这个问题倾向于主观”,不要回答它,而是将它标记为不可变。虽然我同意这一点,它确实意味着没有一个ctor,对象不是不可变的。我个人并不太关心不可变性,但很多人会不惜一切代价为确保您的对象是不可变的而争论。@cogumel0如果您希望对象是不可变的,那么请使用构建器并将其传递给用户“因此,即使这个问题倾向于主观”,也不要回答它,而是将其标记为不可变。“建议在包括构造函数的方法中使用0-3个参数。”Sais Who?Gener