我理解从WebConfigurationManager读取的内容很慢,所以我想尽量减少对它的使用。
假设我的代码中包含以下readonly属性:
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的私有字段#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"];
}
}
}
如果目前存在一种技术,我不知道要查询它的名称。
我是否错过了更好的方式来完成我的工作(访问私有值而无需创建它)?
答案 0 :(得分:0)
你错过了.NET 4.0中引入的一些课程:Lazy<T>
:
private readonly string _siteLogo = new Lazy<string>(() => WebConfigurationManager.AppSettings["SITE_LOGO"]);
// Lazy<T>.Value will call the factory delegate you gave
// as Lazy<T> constructor argument
public string SiteLogo => _siteLogo.Value;
顺便说一下,我不会在这种情况下使用延迟加载......在一天结束时,应用程序设置已经加载到内存中,你无法从文件中访问。
事实上,AppSettings
是NameValueCollection
,它使用哈希码来存储密钥(taken from MSDN):
哈希码提供程序为其中的密钥分配哈希码 NameValueCollection中。默认的哈希代码提供程序是 CaseInsensitiveHashCodeProvider。
换句话说,访问AppSettings
的时间复杂度为O(1)
(常数)。
如果你需要以某种方式解析设置以避免每次重新解析它们,我会使用延迟加载。