两种计算C#属性的方法

时间:2014-03-17 07:40:52

标签: c# performance properties

美好的一天。我无法理解哪种方法最好使用:在访问它时计算属性或每次必须更改时计算属性。例如,实现Level属性的两种方法:

public class TreeNode
{
    public TreeNode()
    {
        ChildNodes = new Collection<TreeNode>();
    }

    public Collection<TreeNode> ChildNodes { get; private set; }
    public TreeNode ParentNode { get; private set; }
    public int Level
    {
        get
        {
            if (ParentNode != null) return ParentNode.Level + 1;
            else return 0;
        }
    }

    pubic void Add(TreeNode node)
    {
        this.ChildNodes.Add(node);
        node.ParentNode = this;
    }

    public void TraverseNodes(Action<TreeNode> action)
    {
        action(this);
        foreach (CTreeNode child in this.ChildNodes)
        {
            child.TraverseNodes(action);
        }
    }
}

最好使用以上还是以下?

public class TreeNode
{
    public TreeNode()
    {
        ChildNodes = new Collection<TreeNode>();
        Level = 0;
    }

    public Collection<TreeNode> ChildNodes { get; private set; }
    public TreeNode ParentNode { get; private set; }
    public int Level { get; private set; }

    pubic void Add(TreeNode node)
    {
        this.ChildNodes.Add(node);
        node.ParentNode = this;
        node.TraverseNodes(eachNode =>
        {
            eachNode.Level += this.Level + 1;
        });
    }

    public void TraverseNodes(Action<TreeNode> action)
    {
        action(this);
        foreach (CTreeNode child in this.ChildNodes)
        {
            child.TraverseNodes(action);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您可以问自己的一些问题是:

  • 是否有额外的开销与提前计算所有节点的属性值相关联?
  • 访问该物业的频率是多少?

在您的情况下,您建议的第二个解决方案存在开销 - 无论何时树发生更改,您都会在可能的大量节点上调用TraverseNodes。这很贵。

另一方面,每次访问节点时都会按需递归计算属性(第一个解决方案) - 如果您可能访问Level属性,则会成为问题很多。

所以这一切都取决于你使用Level属性的程度。如果您经常使用它,而不是经常向树中添加内容,请考虑使用第二种解决方案。

如果您经常更换树,而不是非常关注Level,那么使用您的第一种方法可能会更好。

但是,您最好的选择是尝试使用典型的使用方案和基准。然后你会得到明确的答案。