【问题标题】:How can I use C#6 to shorten repeated declarations and initialization?如何使用 C#6 缩短重复声明和初始化?
【发布时间】:2017-08-17 20:20:28
【问题描述】:

我已经简化了下面的示例代码来演示这个问题。一个Page 对象可以有N 个Element 对象,理论上可能有数百个。为了使代码尽可能可维护,我想问是否有一种方法可以声明每个 Element 并在同一行初始化它。

我的第一次尝试是B,但这很烦人/乏味,因为我必须在一个地方声明Element,然后在类的单独部分的构造函数中对其进行初始化.

下一次尝试,我目前使用的方法是A。对于每个Element,它比 B 多一点代码,但它都是一个地方。另一个优点(在我的情况下)是 Element 对象直到/如果需要它实际上不会被创建。缺点(在我看来这种方法)是当有 20 多个 Element 属性时,文件仍然很长,而且都是复制/粘贴。

我正在寻找一种在一行上声明和初始化每个 Element 的方法(如果它可以是像 A 这样的单例,那将是一个奖励)。 C 是我可以接受但由于明显原因实际上并未编译的示例。有没有办法缩短 B 或用一些新的 C#6 功能以更短、更清晰的方式重写它?


public class Authorization
{
}

public class Element
{
    private Authorization _authorization;

    public Element(Authorization authorization)
    {
        _authorization = authorization;
    }
}

public class Page
{
    private Authorization _authorization;

    public Page(Authorization authorization)
    {
        _authorization = authorization;

        ElementTwo = new Element(_authorization);
    }

    // A
    private Element _elementOne;
    public Element ElementOne => _elementOne ?? (_elementOne = new Element(_authorization));

    // B
    public Element ElementTwo { get; private set; }

    // C - Ideal
    // A field initializer cannot reference the non-static field, method, or property 'Page.Authorization'
    // Cannot access non-static field Authorization in static context
    public Element ElementThree { get; } = new Element(_authorization);
}

【问题讨论】:

  • 你可能想重新阅读你的帖子,它没有多大意义。你能编辑澄清一下吗?
  • 结合 B 和 C 时我看不出哪里有问题,你可以在同一行有私有 setter 和初始化属性:public Element ElementThree { get; private set; } = new Element(Authorization); 看起来你有不同的问题,因为你有代码重复,但从提供的代码中看不出来,所以我们无法为您提供帮助。
  • @CrudaLilium 不需要私有设置器。您的“解决方案”将无法编译,原因与他们在问题中提到的 OP 代码无法编译的原因完全相同。
  • @Servy 你是对的,没有注意到它是关于构造函数中的依赖而不是内联声明。
  • 您的类 Element 包含一个名为 Field 的构造函数,这是不可能的。它必须与类的名称完全相同。

标签: c# coding-style c#-6.0


【解决方案1】:

您可以使用字典和方法吗?如果 [CallerMemberName] 不起作用,请不要向我开枪,我没有编译这段代码。

public class Page {

  private readonly Authorization _auth;
  private readonly IDictionary<string, Element> _elements = new Dictionary<string, Element>();

  public Element ElementOne => GetOrCreateElement();
  public Element ElementTwo => GetOrCreateElement();
  public Element ElementThree => GetOrCreateElement();

  public Page(Authorization auth) {
    _auth = auth;
  }

  private Element GetOrCreateElement([CallerMemberName] string name = null) {
    if(_elements.TryGetValue(name, out var returnElement)) 
      return returnElement;
    var element = new Element(_auth);
    _elements.Add(name, element);
    return element;
  }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-21
    • 2020-12-14
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    相关资源
    最近更新 更多