[解決済み] x is null」と「x == null」の違いは何ですか?
質問
C# 7 では
if (x is null) return;
ではなく
if (x == null) return;
新しい方法(前者の例)を使うことで、古い方法より優れている点はありますか?
セマンティクスに違いはありますか?
好みの問題なのでしょうか?もしそうでないなら、どのような場合にどちらを使うべきでしょうか?
参考にしてください。 C# 7.0の新機能 .
解決するには?
更新してください。
Roslynコンパイラーが更新され、2つの演算子の動作が同じになりました。
オーバーロードされた等式演算子がない場合
. をご覧ください。
現在のコンパイラの結果にあるコード
(
M1
と
M2
は、オーバーロードされた等価比較器がない場合に何が起こるかを示しています。両者とも、よりパフォーマンスの高い
==
という動作をします。オーバーロードされた等価比較器がある場合。
の場合、コードはまだ異なっています。
.
Roslynコンパイラの古いバージョンについては、以下の解析を参照してください。
について
null
は、C# 6で慣れ親しんできたものと違いはありません。しかし
null
を別の定数に変更します。
たとえば、こんな感じです。
Test(1);
public void Test(object o)
{
if (o is 1) Console.WriteLine("a");
else Console.WriteLine("b");
}
このテストでは
a
. と比較すると
o == (object)1
と書くと、とんでもない違いが出てきます。
is
は、比較の相手側の型を考慮します。かっこいいですね。
私は、この
== null
vs.
is null
の定型パターンは、「たまたま」とても身近なものであるだけで、その構文が
is
演算子と等号演算子が同じ結果になる。
として
ヴィーク
とコメントした。
is null
コール
System.Object::Equals(object, object)
ここで
==
コール
ceq
.
のIL
is
:
IL_0000: ldarg.1 // Load argument 1 onto the stack
IL_0001: ldnull // Push a null reference on the stack
IL_0002: call bool [mscorlib]System.Object::Equals(object, object) // Call method indicated on the stack with arguments
IL_0007: ret // Return from method, possibly with a value
のIL
==
:
IL_0000: ldarg.1 // Load argument 1 onto the stack
IL_0001: ldnull // Push a null reference on the stack
IL_0002: ceq // Push 1 (of type int32) if value1 equals value2, else push 0
IL_0004: ret // Return from method, possibly with a value
について話しているので
null
であるため、違いはありません。
のインスタンスにのみ差異を生じます。
. これは、等号演算子をオーバーロードした場合に変更される可能性があります。
関連
-
[解決済み] [Solved] .NETでスレッドの終了を待つには?
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] JavaScriptで空文字列/未定義文字列/null文字列をチェックするにはどうすればよいですか?
-
[解決済み] C#の正しいバージョン番号を教えてください。
-
[解決済み] .NETでのdecimal, float, doubleの違い?
-
[解決済み] C#がforeachで変数を再利用するのは理由があるのか?
-
[解決済み] C#のconstとreadonlyの違いは何ですか?
-
[解決済み] JavaScriptのnullとundefinedの違いは何ですか?
-
[解決済み] .NET Coreと.NET Standard Class Libraryのプロジェクトタイプの違いは何ですか?
-
[解決済み] Nullable<T>.HasValueとNullable<T> != nullの違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C# [解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C#.
-
[解決済み】SmtpException: トランスポート接続からデータを読み取れません:net_io_connectionclosed
-
[解決済み] 'SubSonic.Schema .DatabaseColumn' 型のオブジェクトをシリアライズする際に、循環参照が検出されました。
-
[解決済み] UnityでOnCollisionEnterが呼ばれない
-
[解決済み] EntityTypeにキーが定義されていないエラー
-
[解決済み】「...は'型'であり、与えられたコンテキストでは有効ではありません」を解決するにはどうすればよいですか?(C#)
-
[解決済み】ランダムなブーリアンを生成する最速の方法
-
[解決済み】C#のequal to演算子でtextとvarcharのデータ型は互換性がない
-
[解決済み】IntPtrとは一体何なのか?
-
[解決済み】「namespace」なのに「type」のように使われる。