-3

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

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

然而,对于许多领域来说,从这样的参数间接分配属性看起来既丑陋又间接。有没有更直接的方法?例如,您可以在哪里指定字段名称,而不是指定参数名称,然后它会直接分配它?

4

1 回答 1

0

我猜你想在构造函数中初始化字段的原因是出于不变性的原因,但是由于你没有创建字段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 ...

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

于 2013-11-14T09:15:11.063 回答