我想检查本身是子对象的数组上的属性是否不为空。
所以我有
if (Parent.Child != null && Parent.Child[0] != null && Parent.Child[0].name != null)
var myName = Parent.Child[0].name
这似乎是一种非常冗长的方式来获取 child[0].name 同时避免空引用异常。我也得到索引超出范围的错误。有没有更好的办法?
我想检查本身是子对象的数组上的属性是否不为空。
所以我有
if (Parent.Child != null && Parent.Child[0] != null && Parent.Child[0].name != null)
var myName = Parent.Child[0].name
这似乎是一种非常冗长的方式来获取 child[0].name 同时避免空引用异常。我也得到索引超出范围的错误。有没有更好的办法?
如果您遇到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)
{
...
}
除了缺少对空数组的测试之外,您的代码看起来还不错,并且是正确的防御性编程。您应该将其提取到一种方法中,以使其意图更清晰,并使您的代码更清晰:
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
{
}
但是,这是不好的编程习惯,因为:
尝试
var Names = new List<string>();
if(Parent.Child != null && Parent.Child.Count() > 0){
foreach(var item in Parent.Child) Names.Add(item.name)
}
var ParentChild= Parent.Child[0] ;
if (Parent.Child != null && ParentChild != null &&ParentChild.name != null)
var myName = ParentChild.name
也许简单的 try/catch 会有所帮助?
var myName;
try
{
myName = Parent.Child[0].name;
}
catch (NullReferenceException)
{ myName = null; }