我猜你想在构造函数中初始化字段的原因是出于不变性的原因,但是由于你没有创建字段readonly
(并且你已经调用了你的 fields prop
),你显然也可以使用属性初始化语法糖,如果您将字段更改为属性,请按如下方式减少您的 LOC:
public class Stuff {
public int Prop1 {get; set;}
public int Prop2 {get; set;}
}
调用者将只使用默认构造函数:
var myStuff = new Stuff() {
Prop1 = 54,
Prop2 = 88
}
编辑
我想总结一下下面的玩笑:
- 如果将 'prop1' 等保留为
fields
,则没有速记。
- 如果 'prop1' 等需要保持私有(尽管在外部初始化),那么也没有速记。
- 如果字段可以转换为可公开设置的属性,那么您可以使用自动属性,如上所述。
但是,我在这里推测,如果您的问题是使用ctor
初始化程序来促进字段的不变性的要求,那么允许混合语法糖允许类似于自动属性的不变性组合会很好会降低LOC。
一些人已经在呼吁在 C# 中实现只读自动属性,尽管关于这是否扩展到作为构造函数的一部分的初始化器语法尚有推测。
这可能允许以下典型的详细模式:
class SomeClass
{
private readonly SomeDependency _dep1;
private readonly AnotherDependency _dep2;
. . .
public SomeClass(SomeDependency dep1, AnotherDependency dep2, …)
{
_dep1 = dep1;
_dep2 = dep2;
…
}
替换为更简单但等效的代码。我完全不知道语法会是什么样子......但这意味着一个属性(或字段)是“私有只读的”,除了 CTOR 初始化器语法的一个例外......
"ReadOnly" SomeDependency Dep1 { private get; private set; }
"ReadOnly" SomeDependency Dep1 { private get; private set; }
. . . No need for ctor since can just use the default constructor
然后可以在施工时使用:
var x = new SomeClass
{
Dep1 = ...,
Dep2 = ...
}; // OK, this time only, because it is at construction time.
但没有变异
x.Dep1 = ...; // Compile time err ...
显然,要求是所有此类属性必须同时初始化(或者只是使用对象生命周期的默认类型烘焙)......