属性容器类加载/实例化到内存中后,是否立即评估属性 getter
本文关键字:属性 是否 getter 评估 内存 类加载 实例化 | 更新日期: 2023-09-27 18:33:45
我有一个简单的问题。我设计了一个 C# 类,其中我得到了一些属性获取者,他们负责执行一些性能昂贵的任务。我班上有很多这样的属性。我的问题是,一旦类的实例加载到内存中,这些属性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;
}
}
这样,您可以评估分配。