2011-06-21 11 views
3

可能性の重複をチェックします:C#の:正気ではラインのノイズを低減するには

if (foo != null && 
    foo.bar != null && 
    foo.bar.baz != null && 
    foo.bar.baz.bat != null) 
{ 
    var bat = foo.bar.baz.bat; 
    bat.cat = 5; 
    bat.dog = 6; 
} 

Shortcut for “null if object is null, or object.member if object is not null”

私はC#でテストシンプルなのこのタイプを作るための方法があった希望します

これをサポートする可能性のある機能の1つは、新しい変数宣言をサポートする文

if (foo != null && 
    (var bar = foo.bar) != null && 
    (var baz = bar.baz) != null && 
    (var bat = baz.bat) != null) 
{ 
    bat.cat = 5; 
    bat.dog = 6; 
} 

提案された解決法が実際にはこの例ではもっと長くなっているので、ここでの利得は明らかではないかもしれません。しかし、より長い名前でそれは本当に報いるでしょう。

これを行うにはもっと良い方法はありますか?このような提案が実際に将来のバージョンの言語になる可能性があります(Eric Lippertに電話してください)。

+2

あなたはそのようなドット演算子を介して4つのレベルの深さに行く必要があるあなたのデザインを再訪するのは良い時かもしれません。これは一度にすべてを通過する間接指示のレベルです。 –

+1

あなたの質問は何ですか? StackOverflowは.NET機能のウィッシュリストではありません。 http://connect.microsoft.comサイトを使用して、Microsoftに直接機能を要求してください。 –

+0

さて、あなたはtryでラップしてNullReferenceExceptionをキャッチすることができますが、手動でヌルチェックを実行するよりもはるかに遅いと思われます。 –

答えて

4

チェックこの記事:Chained null checks and the Maybe monad

+0

それは気にしませんでした。これらのメソッド呼び出しではあまり効率的ではありませんが、perfが大きな問題ではない場合には使用可能です。 – bright

2

I通常はファイルの一番下に、独自のメソッドにif文で式を移動する:これはかなり頻繁に要求された機能である

if (CheckBat(foo)) 
{ 
    var bat = foo.bar.baz.bat; 
    bat.cat = 5; 
    bat.dog = 6; 
} 

... snip ... 

private bool CheckBat(MyFoo foo) 
{ 
    return foo != null && 
      foo.bar != null && 
      foo.bar.baz != null && 
      foo.bar.baz.bat != null; 
} 
2

良い質問ですが、悪意があります。あなたのコードは無視されますLaw of Demeter

関連する問題