問題タブ [null-propagation-operator]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 配列要素の存在を「無効化」するための Null 条件演算子
新しい C# 6.0 の null 条件演算子は、より簡潔で複雑でないコードを記述するための便利な手段です。customers
顧客の配列があると仮定すると、これを使用して nullの場合、長さの代わりに null を取得できます( MSDNの例):
同様に、次のように顧客の代わりに null を取得できます。
より複雑な式でcustomers
は、is null、最初の顧客が null、または最初の顧客のOrders
オブジェクトが nullの場合に null が返されます。
しかし、null 条件演算子が対処していないように見える、存在しない顧客の興味深いケースがあります。上記で、nullの顧客、つまりcustomers
配列内のエントリが null の場合がカバーされることを見てきました。しかし、それは存在しない顧客とはまったく異なります。たとえば5
、3 要素の配列で顧客を探したりn
、0 要素のリストで顧客を探したりします。(同じ議論が辞書検索にも当てはまることに注意してください。)
null 条件演算子は、NullReferenceException の影響を無効にすることのみに重点を置いているように思えます。IndexOutOfRangeException または KeyNotFoundException は単独で公開されており、隅に追い詰められており、自力で対処する必要があります。null条件演算子の精神で、それらのケースも処理できるはずです...それが私の質問につながります。
私はそれを逃しましたか?null 条件は、この式を真にカバーするエレガントな方法を提供しますか...
...ゼロ番目の要素がない場合は?
c# - Null 条件演算子、一部のマシンで期待どおりに動作しない
WebApi 2 プロジェクトの DelegatingHandler に次のコードがあります。
私のマシンでは、これは期待どおりに機能し、301 リダイレクトである応答中に (result.content が null になる場合)、responseContent == null; を取得します。ただし、同僚のマシンでは、この行でヌル参照例外を受け取ります。どちらも 4.5.1 ランタイムを使用していますが、わかる限りの違いは次のとおりです。
- 私は VS2015 Enterprise SP2 (動作する場所) を使用していますが、彼は VS2015 Professional SP2 (動作しない場所) を使用しています。
Ninja Edit -私がインストールした .NET バージョンとサービス パック、および彼がインストールしたもの...
動作していないマシンに 2 つの 4.5.1 セキュリティ更新プログラム ( KB2901126 & KB2931368 ) がインストールされているようですが、インストールしていないのはこれらのいずれかでこの問題が発生しますか? 確認する必要があるコンパイラまたはコンパイラ オプションに違いはありますか? それとも、もっと簡単な説明があるものを調べていますか?
roslyn - ロズリン C#6 ?. ジェネリック型で演算子のコンパイルが乱雑に見える
次のクラス定義を考えてみましょう。
結局のところ、いくつかのメモ:
MyClass<T>
T
タイプに関する制約を課さないため、T
aclass
または astruct
;c2() == c1(t)
常に真でなければなりません。- http://tryroslyn.azurewebsites.net/サイトを使用して、いくつかのコード スニペットをコンパイルし、Roslyn が出力するものを確認しています。
それでは、Roslyn のコンパイル方法を分析してみましょうMyClass<T>
。
1.) c1(T)
ケース:
予想通り、Roslyn コンパイラによって生成されたコードを検証した後、次のことがわかります。
2.) c2()
ケース:
私が期待したのは、c1(T) と同じコードでした。しかし、私が見ているのは次のとおりです。
うわー、なぜこのすべての不要なコードが発行されるのですか? リリース コンパイル モードでは、C1 メソッドのコード サイズが 39 バイトであるのに対し、C2 メソッドのコード サイズは 68 バイトであることがわかります。これは最適化できるものですか?
c# - o?.Value の式ツリー
式ツリーを使用してこの文を生成したいと思います。
o
どのクラスのインスタンスでもあります。
何か方法はありますか?
c# - なぜ Nullable の null 伝播はT を返し、Nullable ではない?
次のコードを検討してください。
Null 伝搬はT
ではなく を返しますNullable<T>
。
方法と理由?