两次调用相同的C#属性是不好的编程习惯吗?

Joh*_*ith 3 c# java methods properties

举个例子,我看过很多C#代码如下:

XmlNode n = GetXmlNode();
String[] attributes = new String[n.Attributes.Count];
for (int x = 0; x < n.Attributes.Count; x++)
{
    //do something
}
Run Code Online (Sandbox Code Playgroud)

现在,如果这是java,我们可以编写类似于以下的代码,但我们会犯getAttributes()两次调用该方法,如果我没有弄错,有一条规则说不是多次调用同一个方法,只是声明一个变量来保存对方法调用返回的对象的引用,然后根据需要多次使用该变量.

Node n = GetXmlNode();
String[] attributes = new String[n.getAttributes().getLength()];
for (int x = 0; x < n.getAttributes().getLength(); x++)
{
    //do something
}
Run Code Online (Sandbox Code Playgroud)

但是,由于C#属性只是一个getter方法和一个封装在一个类型成员中的setter方法,它是否遵循相同的规则应该遵守?

或者规则不适用于这种情况,因为假设在标准库中调用C#属性和Java get方法只返回对字段的引用而不是执行繁重的工作是"安全的"吗?

Pat*_*shu 5

永远不要存储您可以计算的内容 存储您可以计算的内容会在计算值发生变化但您仍在使用存储值时导致细微错误.如果你的程序很慢,那么只有违反这个规则,这是它变慢的最大原因(提示:它可能不是)


mip*_*e34 3

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

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

良好-自动属性

public string MyValueProperty { get; set; }
Run Code Online (Sandbox Code Playgroud)

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

private string myValueProperty;
public string MyValueProperty
{
     get{
          return myValueProperty;
     }
     set{
          this.myValueProperty = value;
     }
}
Run Code Online (Sandbox Code Playgroud)

多次调用此类属性对性能影响很小或没有影响。它类似于在java中调用基本的getter/setter方法。

不好- 涉及一些计算来获取财产价值

public string MyLongTimeToGetValueProperty
{
     get 
     { 
          var res = DoSomeComputation();
          return res;
     }
}
Run Code Online (Sandbox Code Playgroud)

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