C#言語は、この種のロジックに新しい演算子を実際に使用できると思います。これは非常に一般的であり、演算子は数え切れないほどのコード行を単純化します。
「??」に沿った何かが必要です または「ifnullthen」演算子ですが、これは特別な「。」として機能します。「nullでない場合」の条件を持つドット演算子。「??」の場合、最初の「?」「?:」if-thenの「if」部分と2番目の「?」のようなものです。null許容型のように「null」を表します。「。?」が必要だと思います '。'と同じように機能する演算子。ただし、例外をスローするのではなく、左側の式がnullの場合にnullと評価されるだけです。私はそれが「nullではないドット」演算子になると思います(OK、おそらく「。!?」はより論理的ですが、そこには行かないでください)。
したがって、非常に一般的な例では、次のような冗長なシンボル名が失われる可能性があります。
var a = long_expression.?Method();
ネストされたnullチェックを備えたC#コードがたくさんあり、非常に役立ちます。これがあればどれだけいいか考えてみてください。
if (localObject != null)
{
if (localObject.ChildObject != null)
{
if (localObject.ChildObject.ChildObject != null)
localObject.ChildObject.ChildObject.DoSomething();
}
}
ちょうどなる可能性があります:
localObject.?ChildObject.?ChildObject.?DoSomething();
また、存在するはずのnullチェックが欠落しているコードが大量にあり、実行時エラーが発生することがあります。したがって、実際には新しい「。?」を使用します 演算子はデフォルトでそのような問題を排除します...「。」の動作を元に戻すことができなかったのはおそらく残念です。と '。?' この時点では、新しい「。?」のみです。左側がnullの場合、例外をスローします。これは、よりクリーンで論理的な方法ですが、変更を壊すのは非常に悪いことです。ただし、この特定の変更により、多くの隠れた問題が修正される可能性が高く、何かが壊れる可能性は低いと主張することもできます(null ref例外がスローされることを期待するコードのみ)。ああ、まあ...いつでも夢を見ることができます...
nullをチェックすることの唯一の欠点は、実際にはわずかなパフォーマンスの低下です。これが最も確実な理由です。nullをチェックしません。しかし、私は本当に「。?」を使用する能力を考えています。パフォーマンスを気にするとき(そして左側がnullになることは決してないことを知っているとき)は、より良い方法でした。
同様に、'foreach'でnullコレクションをチェックして無視することも、はるかに優れていたでしょう。ほとんどの「foreach」ステートメントを「if(collection!= null)」でラップする必要はありません。さらに悪いことに、nullの代わりに常に空のコレクションを使用するという一般的な習慣を身に付ける必要があります...これは場合によっては問題ありませんが、さらに悪いことですコレクションの大部分が空である複雑なオブジェクトツリーでこれが行われる場合のnullチェックよりもパフォーマンスの問題(これは私がよく見たものです)。ほとんどの場合、パフォーマンスを向上させるためにnullの「foreach」チェックを行わないという善意は裏目に出たと思います。
アンダース、そのような変更を加えるのに遅すぎることは決してなく、それらを有効にするためにコンパイラスイッチを追加してください!