うーん、興味深い質問です。ILSpyで見ると、逆コンパイルされたコードは次のように表示されます。
string str = "abc";
string a;
if ((a = str) != null && a == "")
{
Console.WriteLine("Hello");
}
Console.ReadLine();
ブロックに変換する理由はif-else
、switchステートメントにcase句が含まれている場合、それ以外の場合はルックアップテーブルが使用されるためです(数はわかりません5
が、これはに表示されているものです)。 ILSpy)5
if - else
5
今それは不平を言っていa == ""
ます、そしてここにそれがそれについて不平を言っている理由の説明があります:
CA1820:文字列の長さを使用して空の文字列をテストします
String.LengthプロパティまたはString.IsNullOrEmptyメソッドを使用した文字列の比較は、Equalsを使用するよりも大幅に高速です。。これは、EqualsがIsNullOrEmptyまたはLengthプロパティ値を取得してゼロと比較するために実行された命令の数よりもはるかに多くのMSIL命令を実行するためです。EqualsとLength==0は、null文字列では動作が異なることに注意してください。null文字列のLengthプロパティの値を取得しようとすると、共通言語ランタイムはSystem.NullReferenceExceptionをスローします。ヌル文字列と空の文字列を比較する場合、共通言語ランタイムは例外をスローしません。比較はfalseを返します。nullのテストは、これら2つのアプローチの相対的なパフォーマンスに大きな影響を与えません。.NET Framework 2.0を対象とする場合は、IsNullOrEmptyメソッドを使用します。それ以外の場合は、可能な限り長さ==の比較を使用してください。