属性容器类加载/实例化到内存中后,是否立即评估属性 getter

本文关键字:属性 是否 getter 评估 内存 类加载 实例化 | 更新日期: 2023-09-27 18:33:45

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

我知道我应该使用方法来执行昂贵的任务,但我只是发现在一个类中有很多成员的情况下,使用属性更易于维护。

谢谢。

属性容器类加载/实例化到内存中后,是否立即评估属性 getter

属性获取者/资源库将针对每次调用它们进行评估。它们只不过是方法的语法。

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

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

不,在实例化类时不会评估它们。 只有在访问它们时(以及此后的每次)才会对其进行评估。 这允许您在"延迟加载"时实现。 明智的做法是(根据您的情况)在评估一次后将结果保存在专用字段中,并为每次后续调用返回该结果。

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

调用它们时,会评估它们。考虑一下:

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

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

还要考虑静态属性在应用程序生存期内仅填充一次。因此,这也是一种选择,具体取决于你的方案。

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

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

这样,您可以评估分配。