予期せぬことを明らかにする: C# と .NET の隠れた特徴
この記事では、C# と .NET の驚くべき動作をいくつか取り上げ、厳密なテストとエッジ ケースの慎重な検討の必要性を示します。
興味深い例の 1 つは、文字列インターンです。 次のコード スニペットを考えてみましょう:
<code class="language-csharp">string x = new string(new char[0]); string y = new string(new char[0]); Console.WriteLine(object.ReferenceEquals(x, y));</code>
直感的には、False
が出力として期待されるかもしれません。ただし、x
と y
は両方とも空の文字列としてインターンされるため、驚くべき True
結果が生じます。
Null 許容型と GetType()
メソッドでは、別の予期しない動作が発生します。 T
が null 許容型で、すべてのオーバーライドされたメソッド (GetType()
を除く) が実装されている場合、ボックス化されたインスタンスで GetType()
を呼び出すと NullReferenceException
.
<code class="language-csharp">static void Foo<T>() where T : new() { T t = new T(); // ... // This throws a NullReferenceException... Console.WriteLine(t.GetType()); }</code>
さらに、T
が参照型であり、null 以外の値 (T : class, new()
) を必要とする一般的な制約には、微妙な課題があります。 new()
制約は非 null インスタンスを保証することを目的としていますが、これは間接化を使用して回避できます。たとえば、新しく作成されたインスタンスに対して null を返すカスタム プロキシ属性を使用します。
<code class="language-csharp">[MyFunnyProxy] class MyFunnyType : ContextBoundObject { }</code>
これらの例は、C# および .NET フレームワーク内で予期しない動作が発生する可能性を示しています。 堅牢で信頼性の高いアプリケーション開発には、徹底的なテストとエッジケースの鋭い認識が不可欠です。
以上がC#と.netの予期しないコーナーケースは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。