6

一連のステートメントを無視するように C# を指示する方法はありますかNullReferenceException(またはその特定の例外)。これは、多くの null オブジェクトを含む可能性のある逆シリアル化されたオブジェクトからプロパティを読み取ろうとするときに役立ちます。null をチェックするヘルパー メソッドを持つことは 1 つの方法かもしれませんが、ステートメント レベルのブロックで (VB からの)「On Error Resume Next」に近いものを探しています。

編集:Try-Catch は例外で後続のステートメントをスキップします

try
{
   stmt 1;// NullReferenceException here, will jump to catch - skipping stmt2 and stmt 3
   stmt 2;
   stmt 3;
}
catch (NullReferenceException) { }

例: XML メッセージをオブジェクトにデシリアライズしてから、次のようなプロパティにアクセスしようとしています。

Message.instance[0].prop1.prop2.ID

現在、prop2 は null オブジェクトである可能性があります (XSD のオプション要素である XML メッセージに存在しないため)。現在、リーフ要素にアクセスする前に、階層内の各要素の null をチェックする必要があります。つまり、「ID」にアクセスする前に、instance[0]、prop1、prop2 が null でないかどうかを確認する必要があります。

階層内の各要素の null チェックを回避するより良い方法はありますか?

4

5 に答える 5

6

要するに:いいえ。使用する前に参照をヌルチェックしてください。ここで役立つトリックの 1 つは、C# 3.0 拡張メソッドかもしれません...これらを使用すると、エラーなしで null 参照で何かを呼び出しているように見せることができます。

string foo = null;
foo.Spooky();
...
public static void Spooky(this string bar) {
    Console.WriteLine("boo!");
}

それ以外-おそらく条件演算子の使用?

string name = obj == null ? "" : obj.Name;
于 2008-11-18T06:40:37.923 に答える
5

三項演算子および/または?? 演算子が役立つ場合があります。

myItem.MyProperty.GetValue() の値を取得しようとしていて、MyProperty が null である可能性があり、空の文字列をデフォルトにしたいとします。

string str = myItem.MyProperty == null ? "" : myItem.MyProperty.GetValue();

または、GetValue の戻り値が null であるが、デフォルト値を設定したい場合:

string str = myItem.MyProperty.GetValue() ?? "<Unknown>";

これは次のように組み合わせることができます。

string str = myItem.MyProperty == null 
    ? "" 
    : (myItem.MyProperty.GetValue()  ?? "<Unknown>");
于 2008-11-18T07:15:22.453 に答える
1

現在、デリゲートとNullReferenceException処理を使用しています

public delegate string SD();//declare before class definition

string X = GetValue(() => Message.instance[0].prop1.prop2.ID); //usage

//GetValue defintion
private string GetValue(SD d){
        try
        {
            return d();
        }
        catch (NullReferenceException) {
            return "";
        }

    }

アイデアの個別のtry-catchブロックなしで、コードのすべての行をTry-catchに感謝し ます

于 2008-12-14T12:24:04.773 に答える
0

私はヘルパーメソッドを使用します。エラーの履歴書次はただ狂気につながります。

于 2008-11-18T08:14:51.460 に答える
0
try
{
   // exceptions thrown here...
}
catch (NullReferenceException) { }
于 2008-11-18T06:42:17.187 に答える