2012-04-28 10 views
5

ベストプラクティスのガイダンスをお探しですか?のは、私はこのようなコードの行があるとしましょう:お客様、LastOrder、製品、および色が通常の状態でnull可能性がありネストした参照でnullをチェックする方法

Color color = someOrder.Customer.LastOrder.Product.Color; 

。しかし、パス内のオブジェクトのいずれかがnullの場合、colorをnullにしたいと思います。ヌル参照の例外を避けるために、オブジェクトのそれぞれに対してnull条件をチェックする必要があります。

Color color = someOrder == null || 
       someOrder.Customer == null || 
       someOrder.Customer.LastOrder == null || 
       someOrder.Customer.Product == null ? 
       null : someOrder.Customer.LastOrder.Product.Color; 

または私はこの

を行うことができ
Color color = null; 
try {color = someOrder.Customer.LastOrder.Product.Color} 
catch (NullReferenceException) {} 

最初の方法は明らかに動作しますが、読むためにもう少しコードに面倒で難しいようです。 2番目の方法は少し面倒ですが、例外処理を使うのは良い考えではありません。

nullをチェックし、必要に応じてnullをカラーに割り当てる別の簡単な方法がありますか? NullReferenceExceptionsを避ける方法について考えてみましょう。

+2

の可能重複[ディープヌルチェック、良い方法はありますか?](のhttp:// stackoverflowの.com/questions/2080647/deep-null-checking-is-there-a-better-way) –

+0

@MarkByersはい、ありがとうございました。質問です。 –

答えて

5

null安全な参照解除演算子を探しています。

Color color = someOrder?.Customer?.LastOrder?.Product?.Color; 

残念ながらC#ではサポートされていません。おそらくそれは後で追加されるだろうが、現時点でそれを行う計画はない。

関連

+4

2014年のアップデートでは、C#6はこれをサポートしています。 –

+0

現在サポートされています。http://stackoverflow.com/a/2081709/1659248 –

0

私は間違いなく二番目は悪い習慣の私見であるプログラムフローの例外メカニズムを活用し...最初の方法を好むだろう...

AFAIK C#には、ショートカットや "null安全な参照解除演算子"はありません。

0

ネストされたプロパティにアクセスするための一意のメソッドを定義します。見知らぬ人に話をしない:

1

ベストプラクティスとして聞こえるLaw of Demeterに従うことですアプリケーション間であなたの特性が定義されたメソッドへのアクセスを使用して、この

private Customoer GetCustomer(Order order) 
{ 
    return order != null ? order.Customer : null; 
} 

private Order GetLastOrder(Customer customer) 
{ 
    return customer != null ? customer.LastOrder : null; 
} 

のようなたとえば 。私。オブジェクトは、別のメソッドによって返されたメンバオブジェクトのメソッドを呼び出さないようにすべきです。これにより、結合されていない、保守しやすく、読みやすいコードを書くことができます。

したがって、法律の法則に完全に違反しているので、someOrder.Customer.LastOrder.Product.Colorのような 'train wrecks'は使用しないでください。このコードが持つビジネスの意味を理解することさえ困難です。なぜあなたは現在のものではない他の注文の製品の色を取得していますか?

難破船の興味深い終点に近い鉄道難破 - プッシュ機能を取り除く可能な方法。あなたのケースでは、何らかの注文を使用する代わりに、最後の商品をあなたの方法に渡すことも検討してください。

+0

ありがとうございます。私はLoDを見ていきます。ところで、コードは私が作った一例に過ぎず、ビジネス上の意味はありません。 –

+1

私は誰かがこの質問に直接答えるわけではありませんが、これを言ったのが好きです。そのようなコードでヌル参照を使用しようとしないように、複雑なコードを書く必要があることは疑いありません。 C#が可能であるかどうかを含め、技術的な解答を知っておくことは重要ですが、この種のコードは、あなたの全体的な設計を見て驚かせるはずです。 –

1

ここでこれを行う必要があります。

使用

Color color = someOrder.ComplexGet(x => x.Customer.LastOrder.Product.Color); 

または

Color color = Complex.Get(() => someOrder.Customer.LastOrder.Product.Color); 

ヘルパークラスの実装

public static class Complex 
{ 
    public static T1 ComplexGet<T1, T2>(this T2 root, Func<T2, T1> func) 
    { 
     return Get(() => func(root)); 
    } 

    public static T Get<T>(Func<T> func) 
    { 
     try 
     { 
      return func(); 
     } 
     catch (Exception) 
     { 
      return default(T); 
     } 
    } 
} 
関連する問題