ホームページ >バックエンド開発 >C++ >C# および .NET のコーナーケースではどのような驚くべき動作に遭遇する可能性がありますか?

C# および .NET のコーナーケースではどのような驚くべき動作に遭遇する可能性がありますか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-24 18:07:10511ブラウズ

What Surprising Behaviors Can You Encounter with C# and .NET Corner Cases?

予期せぬことを明らかにする: 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 を出力し、xy が同じオブジェクトを参照していることを示します。 これは最適化によるものです。空の文字列を作成すると、キャッシュされたインスタンスが再利用されます。

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

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