2010-02-24 39 views
0

我對c#很陌生,我試圖理解一些非常基本的東西。鏈表和紅/黑樹在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>(); 

在我的程序運行我在樹的遍歷,採取一些節點(根據值),以及添加他們刪除列表。

我不能設置我的想法是,如果例如我有RBTreeNode X,並且我做 X.left = null。我想要發生的事情是將X的左子節點(不影響X.left RBTreeNode,但我認爲這裏會發生的事情是,X.left將變爲null,但X.left RBTreeNode對象也將變爲null。不是我想要的(如果它被複制到deleteList,它將變爲空,這是錯誤的)

我想能夠做與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

不,你沒事。 X.left只是一個變量。將它設置爲null只是將該變量的值設置爲null,對於它用於引用的對象不起作用。

真的沒有這樣的概念,如設置對象在C#中爲null。

我有一篇關於value and reference types in C#的文章,您可能會對此感興趣。

0

屬性是引用,所以基礎內容不會被改變。你可以使用臨時變量進行交換,類似於C++版本(當然除了沒有指針)。