对于任何给定的班级,显然我会有类似的东西:
public class Stuff {
int field1;
int field2;
// [etc.]
public Stuff (int field1In, int field2In) {
field1 = field1In;
field2 = field2In;
}
}
但是,对于许多字段,从这样的参数间接分配属性似乎是丑陋和间接的。还有更直接的方法吗?例如,您可以只指定字段名称而不是指定参数名称,而是直接指定它?
答案 0 :(得分:0)
我猜你想要在构造函数中初始化字段的原因是出于不变的原因,但是因为你没有创建字段readonly
(并且你已经调用了字段prop
),您显然也可以使用property initializer syntactic sugar,如果您将字段更改为属性,请按如下方式减少LOC:
public class Stuff {
public int Prop1 {get; set;}
public int Prop2 {get; set;}
}
调用者只会使用默认构造函数:
var myStuff = new Stuff() {
Prop1 = 54,
Prop2 = 88
}
修改强>
我想总结一下下面的戏:
fields
,则没有简写。然而,我在这里猜测,如果你的问题是为了促进你的领域的不变性而使用ctor
初始化者的要求,那么允许使用混合语法糖是很好的与autoproperties类似的不变性组合将减少LOC。
有几个人已经在调用readonly automatic properties to be implemented in 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 ...
显然,要求是所有这些属性必须同时初始化(或者只是用对象生命周期的默认类型烘焙)...