在不创建C#6.0的情况下访问C#6.0中的私有属性值

时间:2016-03-28 11:32:00

标签: c# c#-6.0

我理解从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"];
        }
    }
}

如果目前存在一种技术,我不知道要查询它的名称。

我是否错过了更好的方式来完成我的工作(访问私有值而无需创建它)?

1 个答案:

答案 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;
顺便说一下,我不会在这种情况下使用延迟加载......在一天结束时,应用程序设置已经加载到内存中,你无法从文件中访问。

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

  

哈希码提供程序为其中的密钥分配哈希码   NameValueCollection中。默认的哈希代码提供程序是   CaseInsensitiveHashCodeProvider。

换句话说,访问AppSettings的时间复杂度为O(1)(常数)。

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