5

举个例子,我见过很多 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 方法只是返回对字段的引用而不是执行繁重的工作是“安全的”?

4

4 回答 4

6

永远不要存储你可以计算的东西。当计算值更改但您仍在使用存储的值时,存储您可以计算的内容将导致细微的错误。仅当您的程序运行缓慢时才违反此规则,这是程序运行缓慢的最大原因(提示:可能不是)

于 2013-02-06T23:08:31.637 回答
3

这取决于是否有一些计算来获取属性的值(我认为在属性获取器中进行一些更大的计算是不好的做法,但你不能依赖没有这样的属性)。

规则是:在大多数情况下,您可以多次调用属性。...但谁知道呢,谁实现了该死的性能杀手属性,只是因为它可以以这种方式实现......

- 自动属性

public string MyValueProperty { get; set; }

像在java中一样编译为getter/setter:

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;
     }
}

最好避免多次调用此类属性。(不管这种属性应该被重构为方法,因为它们的行为就像一个)

于 2013-02-06T23:18:52.737 回答
1

我会认为它是过早的优化.. 取决于它返回的集合有多大。

如果收藏量很大......存储一次计数并从那时起使用它。否则..我根本不会担心。

于 2013-02-06T23:07:50.227 回答
0

如果可能,请在您第一次访问它时第二次使用它。

在您的示例中,您可以编写以下代码:

XmlNode n = GetXmlNode();
String[] attributes = new String[n.Attributes.Count];
for (int x = 0; x < attributes.GetUpperBound(0) + 1; x++)
{
     //do something
}
于 2013-02-06T23:19:45.447 回答