举个例子,我看过很多C#代码,如下所示:
XmlNode n = GetXmlNode();
String[] attributes = new String[n.Attributes.Count];
for (int x = 0; x < n.Attributes.Count; x++)
{
//do something
}
现在,如果这是java,我们可以编写类似于以下的代码,但我们会犯两次调用getAttributes()
方法,如果我没有弄错,那么有一条规则说明了多次调用同一个方法,只需声明一个变量来保存对方法调用返回的对象的引用,然后根据需要多次使用该变量。
Node n = GetXmlNode();
String[] attributes = new String[n.getAttributes().getLength()];
for (int x = 0; x < n.getAttributes().getLength(); x++)
{
//do something
}
但是由于C#属性只是一个getter方法和一个封装在一个类型成员中的setter方法,它是否遵循相同的规则应该被观察到?
或者规则不适用于这种情况,因为假设在标准库中调用C#属性和Java get方法只返回对字段的引用而不是执行强烈的劳动是“安全的”吗?
答案 0 :(得分:5)
永远不要存储您可以计算的内容。存储您可以计算的内容会在计算值发生变化但您仍在使用存储值时导致细微错误。如果你的程序很慢,那么只有违反这个规则,这是它变慢的最大原因(暗示:它可能不是)
答案 1 :(得分:2)
这取决于是否有一些计算来获取属性的值(我认为在属性getter中做一些更大的计算是不好的做法,但你不能依赖于没有这样的属性 )。
规则是:在大多数情况下,您可以多次调用属性。 ...但谁知道,谁实施了该死的性能杀手财产,只是因为它可以这样做......
好 - 自动属性
public string MyValueProperty { get; set; }
编译为getter / setter,如java:
private string myValueProperty;
public string MyValueProperty
{
get{
return myValueProperty;
}
set{
this.myValueProperty = value;
}
}
多次或多次调用此类属性都会受到很少的影响。它类似于在java中调用基本的getter / setter方法。
错误 - 涉及一些计算以获取财产价值
public string MyLongTimeToGetValueProperty
{
get
{
var res = DoSomeComputation();
return res;
}
}
最好避免多次调用此类属性。 (无论这种属性应该重构为方法,因为它们的行为类似于一个)
答案 2 :(得分:1)
我会认为它过早优化..取决于它返回的集合有多大。
如果集合很大,请将计数存储一次,然后再使用它。否则..我根本不担心。
答案 3 :(得分:0)
如果可能,请在第一次关闭时使用它。
在您的示例中,您可以编写以下代码:
XmlNode n = GetXmlNode();
String[] attributes = new String[n.Attributes.Count];
for (int x = 0; x < attributes.GetUpperBound(0) + 1; x++)
{
//do something
}