我对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;
任何提示/解释?
答案 0 :(得分:2)
X.left
只是一个变量。将其设置为null只是将该变量的值设置为null,它对它所引用的对象不执行任何操作。
在C#中确实没有将对象设置为null的概念。
我有一篇关于value and reference types in C#的文章,您可能觉得它很有用。
答案 1 :(得分:0)
属性是引用,因此基础内容不会更改。你可以使用temp变量进行交换,类似于c ++版本(当然除了没有指针)。