如何调用null引用对象的Property

时间:2017-01-21 16:38:51

标签: c# data-structures

考虑以下包含属性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,是否有任何直接方式,以便我可以从空引用对象访问属性Height,以便node.Left.Height返回-1。

我知道一种方法是使用带有签名int getHeight(TreeNode node)的函数,我可以检查节点是否为null。但我想使用node.Left.Height种表达式来返回所需的值。

4 个答案:

答案 0 :(得分:4)

你问如何获得未定义对象的高度?这根本不可能。就像你不能测量建筑物的高度一样。

坚持基于方法的方法。或者在类中创建一个属性,如下所示:

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

答案 1 :(得分: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;
    }
}

答案 2 :(得分:0)

实际上当你处理c#6时,有一个空传播算子。

样品:

int? length = text?.Length;

Null Propagation OPerator

答案 3 :(得分:0)

有些人提出了类似的建议,但你可以做一些像

这样的事情
text?.Length ?? -1

如果text为null,则它将给出默认值-1。没有办法“直接”做text.Length虽然 - 这没有意义,因为没有对象来获取的长度

作为类比,如果我问你住在威斯康星州密尔沃基的独角兽的高度是多少,你会怎么回答?显然,在威斯康星州密尔沃基, 没有独角兽可以获得高度,所以除了“没有这样的独角兽”之外,没有办法给出有意义的答案。