【问题标题】:Are properties defined by the user lazy or eager loaded用户定义的属性是延迟加载还是急切加载
【发布时间】:2013-07-05 07:59:00
【问题描述】:

在 C# 中,当你有一个属性时:

public class Person
{
  public int AnIntegerValue
  {
    get
    {
      //Some logic
      return somevalue;
    }

  }
}

当你从数据库中获取一个 Person 时:

 var mike = Uow.GetPerson("Mike");

是立即评估的 AnIntegerValue 还是代码等待:

mike.AnIntegerValue

我想知道,因为如果您将大量逻辑放入属性中并且它被急切加载,这显然会影响性能。

【问题讨论】:

    标签: c# properties lazy-loading


    【解决方案1】:

    没有立即评估属性。它们在访问“get”修饰符时进行评估。

    说明:

    归根结底,函数和属性之间没有真正的区别。
    含义:

    public int AnIntegerValue
      {
        get
        {
          //Some logic
          return somevalue;
        }
    
      }
    

    相当于:

    Public int get_AnIntegerValue()
      {
    
          //Some logic
          return somevalue;  
    
      }
    

    事实上,这正是你的属性被编译成的(如果你在调试时遵循堆栈,你可以看到)。

    因此,与不会立即评估函数的方式相同,属性也是如此,您可以使用它们而不必担心额外的成本性能。

    您可以查看this 线程,了解有关何时使用属性以及何时使用函数是更好、更优雅的方式的一些指南。

    【讨论】:

      【解决方案2】:

      您应该加载整个对象(或聚合,因为它在域驱动设计中被称为)。延迟加载是一种用于相关对象的技术。我的观点是不应该使用延迟加载,因为它是查询对象图的一种症状。

      可以介绍很多细节,所以我会坚持简短的回答:不要延迟属性/列并尝试从不延迟加载:)

      【讨论】:

        【解决方案3】:

        这取决于GetPerson()的实现。默认情况下,当实例化一个类时,它的属性不会被评估(getter 不会运行)。属性的支持变量将被初始化为其类型的默认值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-08-23
          • 2015-09-30
          • 2017-06-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-14
          • 1970-01-01
          相关资源
          最近更新 更多