【发布时间】: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