ホームページ > バックエンド開発 > C++ > C# および .NET のコーナーケースの一部が期待を裏切るのはなぜですか?

C# および .NET のコーナーケースの一部が期待を裏切るのはなぜですか?

Barbara Streisand
リリース: 2025-01-24 18:02:14
オリジナル
686 人が閲覧しました

Why Do Some C# and .NET Corner Cases Defy Expectations?

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# の空の文字列の特別な処理により、xy が同じオブジェクトを参照することになります。

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート