2017-01-21 55 views
0

考慮下面的類,其中包含一個屬性Height如何調用空引用對象

internal class TreeNode 
{ 
    public int value; 
    public TreeNode Left; 
    public TreeNode Right; 

    public int Height{get;private set} 
} 

一個TreeNode型可變node被初始化(即node==null返回false)和TreeNode.Left =null

試圖node.Left.Height的屬性會拋出NullRefrenceException,是否有任何直接的方式,以便我可以從空引用對象訪問屬性高度,以便node.Left.Height返回-1。

我知道一種方法是使用具有簽名int getHeight(TreeNode node)的函數,其中我可以檢查節點是否爲無效。但我想用node.Left.Height種表達式返回所需的值。

+2

我建議改變你的邏輯來處理null。然後使用null propogation運算符來防止Null引用異常。 –

+0

@JeffSiver完全一樣的想法 – Sherlock

+0

我不明白你的問題,如果一個成員爲空,這意味着*是*沒有設置,因此沒有實例可以屬於一個「高度」。它就像要求問一個不存在的房子的高度一樣。 – HimBromBeere

回答

0

有些人也提出了類似的建議,但你可以做這樣的事情

text?.Length ?? -1 

如果text爲null,它會以默認值-1。沒有辦法「直接」做文本。儘管如此 - 這是沒有意義的,因爲沒有對象可以獲得的長度。作爲一個比喻,如果我問你在威斯康星州密爾沃基生活的獨角獸的高度,你會如何回答?顯然,威斯康星州密爾沃基市沒有獨角獸可以獲得高度,所以除了「沒有這樣的獨角獸」之外,沒有辦法給出有意義的答案。

+1

這是完美的工作,這是最好的方式!感謝空傳播和空合併操作符! –

+0

@DhairyaBhardwaj怎麼樣:D忽略了男人 – Sherlock

+0

@Sherlock不忽視男人!但他的回答對上述問題更具描述性;) –

4

你在問如何得到未定義對象的高度?這根本不可能。就像你不能測量建築物的高度,如果它不在那裏。

堅持基於方法的方法。或者在您的班級中創建一個屬性,如下所示:

public int LeftHeight 
{ 
    get 
    { 
     return Left == null ? -1 : Left.Height; 
    } 
} 
1

您可以實現從不返回null的Left和Right屬性。

private TreeNode _left; 
private TreeNode _right; 
public TreeNode Left 
{ 
    get 
    { 
     return _left ?? new TreeNode() { Height = -1 }; 
    } 
    set 
    { 
     _left = value; 
    } 
} 
public TreeNode Right 
{ 
    get 
    { 
     return _right ?? new TreeNode() { Height = -1 }; 
    } 
    set 
    { 
     _right = value; 
    } 
} 
+0

但現在你可以合法地做'tn.Left。值= 911;'當沒有'TreeNode'分配給'Left' ......並且該值將簡單地「消失」。這將是一個很好的bug /功能,排除故障...... =/ –

+0

從技術上講,高度有一個私人二傳手,但我明白你的觀點。 –

+0

我們沒有設置「高度」,我們正在設置「價值」。 –

0

其實當你在處理c#6時,會有一個空傳播運算符。

樣品:

int? length = text?.Length;

Null Propagation OPerator

+0

你不能這樣做。如果'text'爲'null',那麼你的表達式將返回null,但是你不能把'null'賦給'int'。 –

+0

@Roma現在可以在C#6.0中完成了。它會防止拋出異常 – Sherlock

+0

你還沒有測試過,但你說它的工作原理。請參閱http://prntscr.com/dyiuqo。 '高度'屬性類型是'int' –