我想检查数组本身是子对象的属性是否为空。
所以我有
if (Parent.Child != null && Parent.Child[0] != null && Parent.Child[0].name != null)
var myName = Parent.Child[0].name
这似乎是一种非常漫长的方式来获取子[0] .name,同时避免空引用异常。我也得到索引超出范围错误。还有更好的方法吗?
答案 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
{
}
然而,这是糟糕的编程习惯:
答案 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; }