【问题标题】:Accessing Private Property value in C# 6.0 without creating it在 C# 6.0 中访问私有属性值而不创建它
【发布时间】: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 如果你关心性能,那么你真的应该衡量它,而不是相信你记得互联网上有人说的话。如果你不关心性能,那么这个问题是没有意义的,只使用最可读的。

标签: c# c#-6.0


【解决方案1】:

您错过了一些在 .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):

哈希码提供者为 名称值集合。默认哈希码提供程序是 CaseInsensitiveHashCodeProvider。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 2016-03-05
    • 2012-01-05
    • 2011-04-09
    • 2012-04-29
    • 2012-03-20
    • 1970-01-01
    相关资源
    最近更新 更多