C#在泛型类中定义自动属性

时间:2019-02-04 16:10:58

标签: c# generics properties

我是C#的新手,我正在完成John Sharp写的《 Microsoft Visual C#2013 Step by Step》一书。 关于“泛型”的练习,我找到了以下代码:

public class Tree<TItem> where TItem : IComparable<TItem>
{
    public TItem NodeData { get; set; }
    public Tree<TItem> LeftTree { get; set; }
    public Tree<TItem> RightTree { get; set; }

    public Tree(TItem nodeValue)
    {
        this.NodeData = nodeValue;
        this.LeftTree = null;
        this.RightTree = null;
    }

    public void Insert(TItem newItem)
    {
        TItem currentNodeValue = this.NodeData;
        if (currentNodeValue.CompareTo(newItem) > 0)
        {
            // Insert the new item into the left subtree
            // code here....
        }
        else
        {
            // Insert the new item into the right subtree
            // code here....
        }
    }

}

我不明白为什么他用不同的方式定义了属性。 一种方式:

public TItem NodeData { get; set; }

还有其他人:

public Tree<TItem> LeftTree { get; set; }
public Tree<TItem> RightTree { get; set; }

有人可以解释我为什么?谢谢

2 个答案:

答案 0 :(得分:2)

这些属性用于不同的事物。顾名思义:

  • NodeData用于简化存储在树中的信息。
  • LeftTree / RightTree可以促进树的拓扑结构-每个当前对象(节点)基本上都是以其自身为根的树的根。因此,由于它是二叉树,因此具有两个直接后代-左节点和右节点。

泛型发挥作用的地方是关于树中存储的数据类型。因此,NodeData的类型很简单TItem。左右节点的类型为Tree<TItem>,因此要确保在树的任何深度处都存储着TItem类型的数据。

为了简化起见,假设您要创建一个整数的二叉树。然后,您可以通过以下方式对其进行建模:

public class Tree 
{
    public int Data { get; set; }
    public Tree Left {get; set; }
    public Tree Right {get; set; }
}

我认为通过这种方式,您可以真正了解DataLeftRight属性之间的根本区别。

答案 1 :(得分:0)

他定义了一棵树。 NodeData属性是当前节点值。然后,如果该值小于当前节点,则将新值放在左侧,否则在右侧。如果LeftValue和RightValue的类型为Tree,则它将具有父子结构。此类允许创建类似二叉树的数据结构。