检查null属性

时间:2013-03-02 13:09:43

标签: c#

我想检查数组本身是子对象的属性是否为空。

所以我有

if (Parent.Child != null && Parent.Child[0] != null && Parent.Child[0].name != null)
var myName = Parent.Child[0].name

这似乎是一种非常漫长的方式来获取子[0] .name,同时避免空引用异常。我也得到索引超出范围错误。还有更好的方法吗?

5 个答案:

答案 0 :(得分:5)

如果您收到IndexOutOfRangeException错误,则表明Parent.Child可能为空。所以你真的想要:

if (Parent.Child != null && Parent.Child.Count > 0 && Parent.Child[0] != null &&
    Parent.Child[0].name != null)
{
    ...
}

没有什么可以简化这个非常,尽管你可以写一个版本的LINQ的FirstOrDefault方法,它甚至可以处理源为null:

public static T NullSafeFirstOrDefault(this IEnumerable<T> source)
{
    return source == null ? default(T) : source.FirstOrDefault();
}

然后:

var firstChild = Parent.Child.NullSafeFirstOrDefault();
if (firstChild != null && firstChild.name != null)
{
    ...
}

答案 1 :(得分:1)

除了错过对阵列为空的测试并且是正确的防御性编程之外,您的代码似乎没问题。您应该将其提取到一个方法中,以使其更清晰,并且您的代码更清晰:

if (Parent.HasChild())
{
    var myName = Parent.Child[0].name;
}

public bool HasChild()
{
    return this.Child != null && this.Child.Count > 0 &&
           this.Child[0] != null && this.Child[0].name != null;
}

唯一的另一种方法是将代码包装在try / catch块中:

try
{
    var myName = Parent.Child[0].name;
    ...
}
catch
{
}

然而,这是糟糕的编程习惯:

  1. 您正在使用例外来控制程序流程。
  2. 您正在隐藏其他可能严重的错误。

答案 2 :(得分:0)

 var Names = new List<string>();

 if(Parent.Child != null && Parent.Child.Count() > 0){

 foreach(var item in Parent.Child) Names.Add(item.name)

 }

答案 3 :(得分:0)

var ParentChild= Parent.Child[0] ;
if (Parent.Child != null && ParentChild != null &&ParentChild.name != null)
var myName = ParentChild.name

答案 4 :(得分:-3)

也许简单的try / catch会有帮助吗?

var myName;
try
{
    myName = Parent.Child[0].name;
}
catch (NullReferenceException)  
{ myName = null; }