-2

私はC#を初めて使用します。次のように定義された暗黙の型付き変数があります。

 var item = doc.DocumentNode.SelectNodes("//body[@id='person']")
                                  .Select(p => p.InnerText);

この変数は時々を返しますnull。そして、それはビジュアルスタジオが私に処理するように頼むところですArgumentNullException。しかし、varそうすると、他の人にはわからないままにtryなりcatch、使用できなくなります。

誰かが私にnullオブジェクトデザインパターンを使用するようにアドバイスしましたが、私はそれをどのように実装することになっているのかわかりませんvar。私は毎回ヌルケースを処理するのにうんざりしているので、誰かが私がそのような状況をどのように処理するべきか知っていますか?

4

2 に答える 2

2

どうやら、結果が見つからないときに問題がSelectNodes再発していると思います。nullこれは私が頻繁に遭遇するパターンです: 一連の操作で、そのうちのいくつかはnull値を返す可能性があり、いずれかnullを生成するとシーケンス全体がnull.

Maybe1 つの解決策は、関数型プログラマーがモナドのBindメソッドと呼ぶものを使用することです。

public static U IfNotNull<T, U>(this T self, Func<T, U> func)
    where U : class
{
    return (self != null) ? func(self) : null;
}

これは、例外をスローするのではなく、null を「伝播」します。それで、

doc.DocumentNode
    .SelectNodes("//body[@id='person']")
    .IfNotNull(nodes => nodes.Select(p => p.InnerText));

SelectNodes返された場合はIEnumerable<XmlNode>、次を使用できますEnumerable.Empty<>

(doc.DocumentNode.SelectNodes("//body[@id='person']") ?? Enumerable.Empty<XmlNode>())
    .Select(p => p.InnerText);

または、読みやすくするために、演算子の構文を気にしないように拡張メソッドを記述します。

public static T Coalesce<T>(this T self, T other)
    where T : class
{
    return self ?? other;
}

と:

doc.DocumentNode.SelectNodes("//body[@id='person']")
    .Coalesce(Enumerable.Empty<XmlNode>())
    .Select(p => p.InnerText);

NullPointerExceptionこれらはすべて、 s (またはArgumentException拡張メソッドの場合は s )をキャッチすることなく、結果を処理する準備ができるまで null チェックを延期するさまざまな方法です。最後に単純な演算子を投げると、値を生成するこれらのいずれかがnull代わりにデフォルト値を生成する可能性があることに注意してください。??

于 2012-11-07T15:14:18.747 に答える
0
IEnymerable<HtmlNode> v = null;    
var item = doc.DocumentNode.SelectNodes("//body[@id='person']");
if (item != null)
{
    v = item.Select(p => p.InnerText);
}
于 2012-11-07T15:03:09.527 に答える