【问题标题】:Directly assign parameters to fields (C#)直接将参数分配给字段(C#)
【发布时间】:2013-11-14 09:05:49
【问题描述】:

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

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

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

【问题讨论】:

  • 也许反映你所需要的
  • 这里似乎没有任何优雅/简单的解决方案。您可以尝试面向方面的编程,例如 PostSharp 来根据您的需要定制代码。或者,一些开发支持工具,比如 Resharper,对生成这样的代码有很大帮助(实际上它需要几次击键)。
  • @TimSchmelter Eric 已不在 MSFT,建议 Andres..:)
  • 当您说“许多属性”时,您的意思是多少?如果编写一些赋值语句(即使没有 ReSharper 之类的东西)看起来很繁重就足够了,那么您可能需要重新考虑您的类设计。显然您的帖子只是一个示例,但是如果您传递了数十个 ints 或其他原始类型,例如,您应该考虑将这些值分组到对您的问题域有意义的类中是否更好.
  • 'int prop1;'不是属性。它将被称为字段或成员,但不是属性。请参阅MSDN 了解更多信息。

标签: c# parameters field


【解决方案1】:

我猜你想在构造函数中初始化字段的原因是出于不变性的原因,但是由于你没有创建字段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 初始化器以促进字段的不变性的要求,那么允许混合语法糖允许组合会很好类似于自动属性的不变性,这将减少 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 ...

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

【讨论】:

  • 这对私有财产有效吗? 编辑:不,它不起作用
  • IMO 不回答这类问题。 Op 会提出另一个问题:“哦,无聊,我需要在创建实例的任何地方设置值”?
  • @musefan 不,它不适用于私人properties,显然 :) 但 OP 将他的字段称为“prop1”等,暗示他也对使用属性持开放态度。
  • 那么这个不回答的重点是什么,它不尝试回答 q 并更改 q 以强行解决其他问题?
  • 我已经删除了我的反对票,因为你已经公开了,这在技术上是可行的(尽管你的结构中的分号是有问题的)。但我仍然不同意仅仅为了允许这种类型的结构而改变设计
猜你喜欢
  • 2018-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-10
  • 1970-01-01
  • 2013-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多