【问题标题】:Nullable Bool in Getter MethodGetter 方法中的 Nullable Bool
【发布时间】:2016-09-07 15:51:27
【问题描述】:

团队正在详细讨论我们希望如何处理一个相当大的Account 对象。

我们不希望必须初始化构造函数中的每个属性,因为这会带来太多开销,因为该属性可能永远不会在该网页上使用。所以我们想出了以下内容。

public partial class Account
{
    private bool? projEcho;
    public bool ProjectEcho
    { 
        get
        {
            if (!projEcho.HasValue)
            {
                projEcho = isProjectEcho();
                return (bool)projEcho;
            }
            else 
            { 
                return (bool)projEcho; 
            }
        }
    }
}

这样,如果有人正在使用 Account 对象,并且需要访问该属性,则内部会发生 setter。我们不是这种铸造技术的忠实拥护者,但它是确保在代码运行时我们拥有真/假值的唯一方法。看起来这种方法有问题,但它似乎是仅在需要时才填充属性的最有效方法。

我的问题是:“从开发标准的角度来看,是否有更好的替代方案来实现我们正在努力实现的目标?”

【问题讨论】:

  • 你考虑过代理设计模式吗??
  • 选项列表/代码风格问题通常与 SO 无关。旁注:“初始化......开销太大” - 意味着它不应该是财产......否则这是非常标准的惰性评估 - 不太确定你不喜欢那里。
  • @brykneval 很有趣。我们还没有。虽然通过继承似乎有很多开销,但我们基本上是用这个来做的,但是用一个属性。

标签: c#


【解决方案1】:

这个概念没有错 - 延迟初始化。

您为您的属性保留一个支持字段 null,并在第一次使用时为其分配一个值。 您不需要将可为空的 bool 转换为 bool,您可以使用 Nullable.Value。

private bool? projEcho;
public bool ProjectEcho
    { get
        {
            if (!projEcho.HasValue)
                projEcho = isProjectEcho();
            return projEcho.Value; 
        }
    }

对我来说似乎更好。 .NET 中也支持延迟初始化:

https://msdn.microsoft.com/en-us/library/dd997286(v=vs.110).aspx

但我个人用的不多。

【讨论】:

  • 我也会调查Lazy<T>谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多