2016-06-14 10 views
-1

私は、さまざまなコントロールタイプで構成されたアプリケーションを持っています。これらのコントロールタイプはそれぞれ、オプションでパラメータオブジェクトにリンクできます。System.NullReferenceExceptionエラーの代わりに空の文字列を返します。エラー

これらは、後で再読み込みするためにXMLファイルに保存されます。コントロールをパラメータにリンクするには、指定されている場合は、コントロールにパラメータIDが格納されます。これはロード中に検索され、再リンクされます。

これはオプションであるため、パラメータが指定されていない場合、わかりやすいIDにアクセスしようとするとNullReferenceExceptionが発生します。私は問題の行の周りに小切手を置くことでこれを解決することができます。しかし、私はこの基本的な例で示すように、多くの異なるコントロールタイプと単なるリファレンス以上のためにこれを行う必要があります。

私の質問は、何とかこの呼び出しがこの例外の代わりに空の文字列を返すようにするエレガントな方法ですか?

public class Parameter 
{ 
    public string ID; 
} 

public class LabelCtrl 
{ 
    public string Name; 
    public Parameter LinkedParameter; 
} 

public class XMLManager 
{ 
    public void SaveControl(ControlInstance_LabelCtrl ci) 
    { 
    xmlWriter.WriteStartElement("ControlInstance_LabelCtrl"); 
    { 
     xmlWriter.WriteElementString("Name", ci.Name); 
     // Elegant way to insert empty string instead of causing NullReferenceException error 
     xmlWriter.WriteElementString("LinkedParameter", ci.LinkedParameter.ID); 
    } 
    xmlWriter.WriteEndElement(); 
    } 
} 
+0

Try/Catchを使用しないのはなぜですか?または私は何かを逃していますか? – uTeisT

+0

例外を防ぐことができるのはなぜですか? @uteist –

+0

私は、try/catchに入れて、キャッチしたらString.Emptyを返します。または、xがnullの場合、何かブロックを実行します。 @PatrickHofman – uTeisT

答えて

2

ヌル伝搬演算子(C位から入手可能6)を使用:ci.LinkedParameterに対する簡単なテストを使用し

ci.LinkedParameter != null ? ci.LinkedParameter.ID : null; 
+0

さて、あなたは正しいです。 –

+0

@PartickHofman私はこれについて知らなかったし、完璧に見える... unfortunatly私はC#4.5を使用しており、現時点ではアップグレードすることはできません! : – TheGrovesy

+0

これを使用してください: 'ci.LinkedParameter!= null?ci.LinkedParameter.ID:null;'。 –

0

xmlWriter.WriteElementString("Name", ci.Name); 
xmlWriter.WriteElementString("LinkedParameter", ci.LinkedParameter?.ID); 

またはプレC#6の使用のために。 IDとして文字列:

if (!String.IsNullOrEmpty(ci.LinkedParameter.ID)) { 
    xmlWriter.WriteElementString("LinkedParameter", ci.LinkedParameter.ID); 
} 
else { 
    xmlWriter.WriteElementString("LinkedParameter", String.Empty); 
} 

ブロック・キャッチを試みる:

try { 
    xmlWriter.WriteElementString("LinkedParameter", ci.LinkedParameter.ID); 
} 
catch (e) { 
    xmlWriter.WriteElementString("LinkedParameter", String.Empty); 
} 

あなたがCMIIW、モデルの動作を変更したくない場合は、これらのステートメントが適用されます。

+0

これはIDではなくヌルであるLinkedParameterです。これはNullReferenceExceptionを引き起こさないでしょう。 – stuartd

0

あなたがC#6を使用していない場合は、三項演算子を使用することができます/他になく、よりコンパクトでよりエレガントな場合は、このような行がたくさんある場合、それはだ

xmlWriter.WriteElementString("LinkedParameter", (ci.LinkedParameter != null) ? ci.LinkedParameter.ID : ""); 

を。

関連する問題