1

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

所以我有

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

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

4

5 回答 5

5

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

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

没有什么可以大大简化这一点尽管您可以编写一个版本的 LINQFirstOrDefault方法,它甚至可以处理源为空的情况:

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)
{
    ...
}
于 2013-03-02T13:14:22.830 回答
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. 您正在隐藏其他潜在的严重错误。
于 2013-03-02T13:15:04.380 回答
0

尝试

 var Names = new List<string>();

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

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

 }
于 2013-03-02T13:13:49.950 回答
0
var ParentChild= Parent.Child[0] ;
if (Parent.Child != null && ParentChild != null &&ParentChild.name != null)
var myName = ParentChild.name
于 2013-03-02T13:14:21.940 回答
-3

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

var myName;
try
{
    myName = Parent.Child[0].name;
}
catch (NullReferenceException)  
{ myName = null; }
于 2013-03-02T13:12:18.633 回答