c#中的链表和红/黑树参考问题?

时间:2010-02-24 07:31:51

标签: c# c++ pointers reference

我对c#很陌生,我正在尝试理解一些非常基本的东西。

我想实现RBTree和链表,所以我创建:

public class RBTreeNode
{
        // PROPERTIES
        public RBTreeNode left;
        public RBTreeNode right;
        public RBTreeNode parent;
        public String Color;
        public Int Key;
} 

List<RBTreeNode> deleteList = new List<RBTreeNode>();

在我的程序运行期间,我遍历树,获取一些节点(取决于值),并将它们添加到deleteList。

我无法想到的事情,例如,如果我有RBTreeNode X,我做 X.left = null。我想要发生的事情是使X的左子项归零(不影响X.left RBTreeNode,但我认为这里会发生的是X.left确实会变为null,但X.left RBTreeNode对象也会变为null。这是不是我想要的。(如果它被复制到deleteList,它将变为null,这是错误的)

我希望能够使用指针执行与c ++相同的操作。 在c ++中,我可以这样做:

public class RBTreeNode
{
        // PROPERTIES
        public RBTreeNode* left;
        public RBTreeNode* right;
        public RBTreeNode* parent;
        public std::string Color;
        public int Key;
} 

例如:

RBTreeNode* tenp = X->left;
X->left = null; //(i think in c# it will turn temp here to null to - of course without   pointers)
temp->right = &X;

任何提示/解释?

2 个答案:

答案 0 :(得分:2)

不,你很好。 X.left只是一个变量。将其设置为null只是将该变量的值设置为null,它对它所引用的对象不执行任何操作。

在C#中确实没有将对象设置为null的概念。

我有一篇关于value and reference types in C#的文章,您可能觉得它很有用。

答案 1 :(得分:0)

属性是引用,因此基础内容不会更改。你可以使用temp变量进行交换,类似于c ++版本(当然除了没有指针)。