直接为字段分配参数(C#)

时间:2013-11-14 09:05:49

标签: c# parameters field

对于任何给定的班级,显然我会有类似的东西:

public class Stuff {
    int field1;
    int field2;
    // [etc.]
    public Stuff (int field1In, int field2In) {
        field1 = field1In;
        field2 = field2In;
    }
}

但是,对于许多字段,从这样的参数间接分配属性似乎是丑陋和间接​​的。还有更直接的方法吗?例如,您可以只指定字段名称而不是指定参数名称,而是直接指定它?

1 个答案:

答案 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
}

修改

我想总结一下下面的戏:

  • 如果'prop1'等保留为fields,则没有简写。
  • 如果'prop1'等人需要保密(虽然在外部进行初始化),那么也没有简写。
  • 如果字段可以转换为公开可选择的属性,那么您可以使用自动属性,如上所述。

然而,我在这里猜测,如果你的问题是为了促进你的领域的不变性而使用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 ...

显然,要求是所有这些属性必须同时初始化(或者只是用对象生命周期的默认类型烘焙)...