我有一个简单的问题。我设计了一个C#类,我有一些属性getter负责执行一些性能昂贵的任务。我班上有很多这样的房产。我的问题是,只要将类的实例加载到内存中,就会评估那些属性getter吗?如果是这样,那么,我会考虑将它们分解为方法。我希望他们只在第一次使用该属性时进行评估,但我需要确定这个假设。
我知道我应该使用方法来处理昂贵的任务,但我发现使用Properties更易于维护,因为我在一个类中有很多成员。
感谢。
答案 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;
}
}
这样,您可以评估该分配。