两次调用同一个C#属性是不是一种糟糕的编程实践

本文关键字:一种 编程 是不是 两次 调用 同一个 属性 | 更新日期: 2023-09-27 17:57:57

举个例子,我看到了很多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#属性和Javaget方法的调用只返回对字段的引用,而不是执行繁重的工作是"安全的"吗?

两次调用同一个C#属性是不是一种糟糕的编程实践

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

这取决于是否有一些计算来获得属性的值(我认为在属性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;
     }
}

最好避免多次调用此类属性。(不管这类属性是否应该重构为方法,因为它们的行为与方法类似)

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

如果收藏数量巨大。。将计数存储一次,然后从那时起使用。否则。。我一点也不担心。

在可能的情况下,在第一次访问它的分配的第二次休息时使用它。

在您的示例中,您可以对以下内容进行编码:

XmlNode n = GetXmlNode();
String[] attributes = new String[n.Attributes.Count];
for (int x = 0; x < attributes.GetUpperBound(0) + 1; x++)
{
     //do something
}
相关文章: