2016-03-28 30 views
0

据我所知,从WebConfigurationManager读取速度很慢,所以我想尽量减少使用它。在C#6.0中访问私有属性值而不创建它

说我有我的代码以下只读属性:

public string SiteLogo { 
    get { 
     return WebConfigurationManager.AppSettings["SITE_LOGO"]; 
    } 
} 

在C#6.0中,我可以缩短这个使 “吸气剂” 的缺省值是:

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; 

这仍然需要我为我所有的干将,这似乎过于繁琐的创建私有变量。

我放弃了使用Session变量的想法,因为读取它并将其转换为String似乎仍然会产生更多开销。

我想看到的是一种方法来自动分配私有财产,如果需要的话。

如果被各酒店的私人领域#this编译器,我可以用几行内容:

public string SiteLgo 
{ 
    get 
    { 
     if (String.IsNullOrEmpty(#this)) 
     { 
      #this = WebConfigurationManager.AppSettings["SITE_LOGO"]; 
     } 
     return #this; 
    } 
} 

更妙的是,我不应该在任何时候需要明确地告诉代码块返回的私有财产,因为也就是吸气的工作:

public string SiteLogo 
{ 
    get 
    { 
     if (String.IsNullOrEmpty(#this)) 
     { 
      #this = WebConfigurationManager.AppSettings["SITE_LOGO"]; 
     } 
    } 
} 

如果一种技术来做到这一点目前存在的,我不知道什么叫它来看看它的名字。

我错过了更好的方式来做我以后的事情(访问私有价值,而不必创建它)?

+0

很难想出一个不做它的原因*静态*所以它只做过一次。你没有提到任何理由使它成为一个实例属性,所以这可能是你想要做的。 –

+0

@HansPassant - 我....不知道。我想我会继续这样做。我仍然想知道访问这些专用自动属性的最佳方式。我看到'懒惰'的答案,这可能是我正在寻找的。不过,在这种特殊情况下,静态变量仍然会更好。 – jp2code

+1

你一直在说“我理解它很慢”,“看起来它仍然会产生更多的开销”。你真的衡量过性能吗? – svick

回答

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; 

BTW,我不会在这一天结束时,应用程序设置使用延迟加载这种情况...已经加载到内存中,并且您没有从该文件访问。

事实上,AppSettingsNameValueCollection,它使用散列码来存储密钥(taken from MSDN):

哈希码提供商分配散列码在 NameValueCollection中的密钥。默认的哈希码提供程序是 CaseInsensitiveHashCodeProvider。

换句话说,访问AppSettings具有时间复杂度O(1)(常量)。

如果您需要解析某些设置以避免每次重新解析它们,我都会使用延迟加载。