ホームページ >バックエンド開発 >C++ >C#と.NETには、予期せぬ動作とコーナーケースが存在しますか?

C#と.NETには、予期せぬ動作とコーナーケースが存在しますか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-24 17:56:10301ブラウズ

What Unexpected Behaviors and Corner Cases Exist in C# and .NET?

c#and .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));</code>
は参照型の個別のオブジェクトを作成するという期待と矛盾します。 共通言語ランタイム(CLR)は、この特定のシナリオを最適化し、同じ空の文字列インスタンスを再利用します。

Trueジェネリックタイプとnullablenew:nullreferenceExceptionミステリー

次のコードは、別の予期しない動作を示しています

is

(例えば、

)の場合、
<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

    // This throws a NullReferenceException...
    Console.WriteLine(t.GetType());
}</code>
を呼び出すときに

が発生します。 これは、ほとんどの方法を無効にするが、Tではないためです。 非頻繁にridenされていないNullable<T>への呼び出し中のボクシングプロセスは、null値をもたらします。 int?NullReferenceExceptionプロキシ属性とGetType()制約:期待に反するNullable<T>GetType() GetType()ayende rahienは、同様の、さらに洗練されたシナリオを強調しました:

このコードは、驚くべきことに、アサーションに失敗する可能性があります。 new()呼び出しを傍受してを返すプロキシ属性(

など)を使用することにより、アサーションに違反する可能性があります。これは、ランタイムの動作とカスタム属性の間の予期しない相互作用の可能性を示しています。 これらの例は、徹底的なテストの重要性と、C#と.NET開発の予期しない落とし穴を避けるためのCLRの内部の仕組みの深い理解を強調しています。

以上がC#と.NETには、予期せぬ動作とコーナーケースが存在しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。