一旦将属性容器类加载/实例化到内存中,属性getter是否会被评估?

时间:2012-05-09 00:28:31

标签: c# properties

我有一个简单的问题。我设计了一个C#类,我有一些属性getter负责执行一些性能昂贵的任务。我班上有很多这样的房产。我的问题是,只要将类的实例加载到内存中,就会评估那些属性getter吗?如果是这样,那么,我会考虑将它们分解为方法。我希望他们只在第一次使用该属性时进行评估,但我需要确定这个假设。

我知道我应该使用方法来处理昂贵的任务,但我发现使用Properties更易于维护,因为我在一个类中有很多成员。

感谢。

5 个答案:

答案 0 :(得分:5)

对每个来自/来自他们的电话评估属性getter / setter。它们只不过是方法的句法。

public class Foo
{
   private int actual = 0;
   public int Bar
   {
      get { return actual++; }
      set { value = actual; value++ }
   }
}

int v = foo.Bar; //0
v = foo.Bar; // 1
v = foo.Bar; // 2
foo.Bar = v; // actual = 3

答案 1 :(得分:2)

属性getter不用于实例化,因为getter / setter仅在您调用属性时运行。使用构造函数实例化属性。此规则的例外是延迟初始化,当第一次访问(通常只读)属性的值时初始化。

答案 2 :(得分:2)

不,在实例化类时不会对它们进行求值。只有在访问它们时(以及之后每次)它们才会被评估。这允许您实现“延迟加载”。在评估一次之后将结果保存在私有字段中,并在每次后续调用时返回该结果可能是明智的(取决于您的情况)。

private string foo;
public string Foo
{
  get
  { 
    if (foo == null)
      foo = "expensive operation";
    return foo;
  }
}

答案 3 :(得分:1)

当你打电话给他们时,会评估吸气剂/设定者。考虑一下:

    private string sample;
    public  string Sample
    {
        get
        {
            return (sample = sample ?? SomeExpensiveMethod());
        }
    }

通过这种方式,您可以控制何时拨打昂贵的方法。

另外,请考虑在应用程序生命周期中仅填充一次静态属性。因此,根据您的情况,这也可以是一种选择。

答案 4 :(得分:0)

值得一提的是,您还可以使用关键字“value”来评估要分配的值。例如:

public String Author
    {
        get { return author; } 
        set 
        {
            if (value.Equals(""))
                Console.WriteLine();
            else
                author = value; 
        }
    }

这样,您可以评估该分配。