C# と .NET での予期せぬ動作の調査
堅牢なアプリケーションを構築するには、エッジケースを深く理解する必要があります。 C# と .NET は強力ですが、一般的な前提に疑問を投げかける驚くべきシナリオがいくつかあります。これらの異常な動作を示すいくつかの例を見てみましょう:
new
が新しいオブジェクトを生成しない場合
次の一見単純なコードについて考えてみましょう:
<code class="language-csharp">string x = new string(new char[0]); string y = new string(new char[0]); Console.WriteLine(object.ReferenceEquals(x, y)); // Prints True</code>
new
が常に参照型に対して個別のオブジェクトを作成することが期待されるかもしれません。 ただし、C# の空の文字列の特別な処理により、x
と y
が同じオブジェクトを参照することになります。
Null 許容型と NullReferenceException
このコード スニペットは、null 許容型との不可解な相互作用を強調しています:
<code class="language-csharp">static void Foo<T>() where T : new() { T t = new T(); Console.WriteLine(t.GetType()); // Throws NullReferenceException }</code>
t
が初期化されていても、GetType()
を呼び出すと NullReferenceException
がスローされます。これは、T
が null 許容型 (int?
など) の場合、object
への暗黙的なボックス化により null 値が生成され、ボックス化された null に対して GetType()
が呼び出されたときに例外が発生する可能性があるためです。
ヌル インスタンスのケースnew
<code class="language-csharp">public static void CanThisHappen<T>() where T : class, new() { var instance = new T(); // new() on a ref-type; should be non-null Debug.Assert(instance != null, "How did we break the CLR?"); }</code>
が T
でインスタンス化できる参照型であることを示唆しています。 ただし、リモート処理などの手法 (null を返すプロキシの使用など) はこの期待を回避し、アサーションの失敗につながる可能性があります。 これは、リモート処理などの高度な機能を扱うときに生じる複雑さを浮き彫りにしています。new
以上がC# および .NET のコーナーケースの一部が期待を裏切るのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。