1

それ自体が子オブジェクトである配列のプロパティが null でないことを確認したい。

ので、私は持っています

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

これは、null 参照の例外を回避しながら、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)
{
    ...
}

ソースがnullであっても対処するLINQのメソッドのバージョンを書くことはできますが、これを非常に単純化するものは何もありません:FirstOrDefault

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 に答える