如何使用 C#6 来缩短重复的声明和初始化?
How can I use C#6 to shorten repeated declarations and initialization?
我简化了下面的示例代码来演示这个问题。单个 Page
个对象可以有 N 个 Element
个对象,理论上可能有数百个。为了使代码尽可能易于维护,我想问是否有一种方法可以声明每个 Element
并在同一行对其进行初始化。
我的第一次尝试是B,但这是annoying/tedious,因为我必须在一个地方声明Element
,然后在class.
的单独部分中的构造函数
下一次尝试,我目前使用的方法是A。每个 Element
的代码比 B 多一点,但它是一个地方。另一个优点(在我的情况下)是 Element
对象实际上并没有被创建 until/if 它是需要的。缺点(在我看来,这种方法)是当有 20 多个 Element
属性时,文件仍然很长而且全部是 copy/paste.
我正在寻找一种在一行中声明和初始化每个 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);
}
您可以使用字典和方法吗?如果 [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;
}
}
我简化了下面的示例代码来演示这个问题。单个 Page
个对象可以有 N 个 Element
个对象,理论上可能有数百个。为了使代码尽可能易于维护,我想问是否有一种方法可以声明每个 Element
并在同一行对其进行初始化。
我的第一次尝试是B,但这是annoying/tedious,因为我必须在一个地方声明Element
,然后在class.
下一次尝试,我目前使用的方法是A。每个 Element
的代码比 B 多一点,但它是一个地方。另一个优点(在我的情况下)是 Element
对象实际上并没有被创建 until/if 它是需要的。缺点(在我看来,这种方法)是当有 20 多个 Element
属性时,文件仍然很长而且全部是 copy/paste.
我正在寻找一种在一行中声明和初始化每个 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);
}
您可以使用字典和方法吗?如果 [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;
}
}