予期せぬことを明らかにする: C# と .NET のコーナーケース
ソフトウェア開発では、しばしば驚くべき展開が起こります。 この記事では、経験豊富な開発者にとっても困難となる可能性がある、C# と .NET 内の興味深いコーナー ケースをいくつか取り上げます。
空の文字列オブジェクトの割り当てから始めましょう:
<code class="language-csharp">string x = new string(new char[0]); string y = new string(new char[0]); Console.WriteLine(object.ReferenceEquals(x, y)); // Outputs True</code>
これは驚くべきことに True
を出力し、x
と y
が同じオブジェクトを参照していることを示します。 これは最適化によるものです。空の文字列を作成すると、キャッシュされたインスタンスが再利用されます。
次に、Nullable 型の特徴を考慮してください。
<code class="language-csharp">static void Foo<T>() where T : new() { T t = new T(); Console.WriteLine(t.ToString()); // Works fine Console.WriteLine(t.GetHashCode()); // Works fine Console.WriteLine(t.Equals(t)); // Works fine Console.WriteLine(t.GetType()); // Throws NullReferenceException }</code>
ToString()
、GetHashCode()
、および Equals()
は null 許容型 (int?
など) に対して期待どおりに動作しますが、GetType()
を呼び出すと NullReferenceException
がスローされます。これは、仮想メソッドはオーバーライドされますが、GetType()
はオーバーライドされず、ボックス化された null 許容値を操作し、結果として null 参照が発生する可能性があるためです。
最後に、クラス型を使用した汎用制約を調べてみましょう:
<code class="language-csharp">private static void Main() { CanThisHappen<MyFunnyType>(); } public static void CanThisHappen<T>() where T : class, new() { var instance = new T(); // new() on a ref-type; should be non-null, then Debug.Assert(instance != null, "How did we break the CLR?"); }</code>
T
の非 null インスタンスが期待されるかもしれませんが、これは、null
呼び出しに対して new()
を返すプロキシ クラスを含む手法を使用して回避できます。これは、CLR とマネージド コードの実行時の動作の間の複雑な相互作用を強調しています。 これらの例は、一見単純なコードでも、特定のシナリオでは予期しない動作を示す可能性があることを示しており、徹底的なテストと C# と .NET の基礎となるメカニズムを理解することの重要性を強調しています。
以上がC# および .NET のコーナーケースではどのような驚くべき動作に遭遇する可能性がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。