【发布时间】:2016-03-28 11:32:00
【问题描述】:
我知道阅读WebConfigurationManager 的速度很慢,所以我想尽量减少使用它。
假设我的代码中有以下只读属性:
public string SiteLogo {
get {
return WebConfigurationManager.AppSettings["SITE_LOGO"];
}
}
在 C# 6.0 中,我可以缩短它以便“getter”具有默认值:
public string SiteLogo { get; } = WebConfigurationManager.AppSettings["SITE_LOGO"];
看起来,每次实例化类时都会调用此属性,无论是否使用过该属性。
看起来最有效的调用仍然是声明一个私有变量以在属性中使用:
public string SiteLogo
{
get
{
if (String.IsNullOrEmpty(_siteLogo))
{
_siteLogo = WebConfigurationManager.AppSettings["SITE_LOGO"];
}
return _siteLogo;
}
}
private string _siteLogo;
这仍然需要我为我的所有 getter 创建私有变量,这似乎过于繁琐。
我已经放弃了使用 Session 变量的想法,因为读取它并将其转换为 String 似乎仍然会产生更多开销。
如果需要,我想看看一种自动分配私有财产的方法。
如果编译器调用每个 Property 的 Private 字段 #this,我可以使用以下内容:
public string SiteLgo
{
get
{
if (String.IsNullOrEmpty(#this))
{
#this = WebConfigurationManager.AppSettings["SITE_LOGO"];
}
return #this;
}
}
更好的是,我不需要明确告诉代码块返回私有属性,因为这是 getter 的工作:
public string SiteLogo
{
get
{
if (String.IsNullOrEmpty(#this))
{
#this = WebConfigurationManager.AppSettings["SITE_LOGO"];
}
}
}
如果目前存在这样的技术,我不知道该叫什么名字来查找它。
我是否错过了更好的方式来做我想做的事情(无需创建即可访问 Private 值)?
【问题讨论】:
-
很难找到一个不让它static的理由,所以它只做一次。您没有提到将其设为实例属性的任何理由,所以这可能就是您想要做的。
-
@HansPassant - 我....不知道。我想我会继续这样做。我仍然想知道访问这些私人汽车属性的最佳方式。我看到了
Lazy<T>的答案,这可能就是我正在寻找的。不过,在这种特殊情况下,静态变量仍然会更好。 -
你一直在说“我理解它很慢”和“似乎它仍然会产生更多开销”之类的话。您实际测量过性能吗?
-
@svick - 不,我没有。这些知识仅来自阅读我在网上遇到的最佳实践。如果一家公司在我坐在那里写测试用例的时候付钱给我,我会很乐意衡量并报告绩效。
-
@jp2code 如果你关心性能,那么你真的应该衡量它,而不是相信你记得互联网上有人说的话。如果你不关心性能,那么这个问题是没有意义的,只使用最可读的。