Rumah >pembangunan bahagian belakang >C++ >Apakah Gelagat Mengejutkan yang Boleh Anda Hadapi dengan C# dan .NET Corner Cases?

Apakah Gelagat Mengejutkan yang Boleh Anda Hadapi dengan C# dan .NET Corner Cases?

Susan Sarandon
Susan Sarandonasal
2025-01-24 18:07:10478semak imbas

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

Melancarkan kes yang tidak dijangka: C# dan .NET Corner Cases

Pembangunan perisian sering membentangkan kelainan yang mengejutkan. Artikel ini meneroka beberapa kes sudut yang menarik dalam C# dan .NET yang boleh mencabar pemaju yang berpengalaman.

mari kita mulakan dengan peruntukan objek rentetan kosong:

<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>
Ini menghairankan output

, menunjukkan bahawa True dan x merujuk objek yang sama. Ini disebabkan oleh pengoptimuman: Membuat rentetan kosong menggunakan semula contoh cache. y

Seterusnya, pertimbangkan kebiasaan jenis yang boleh dibatalkan:

<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>
sementara

, ToString(), dan GetHashCode() berkelakuan seperti yang diharapkan untuk jenis yang tidak dapat dibatalkan (seperti Equals()), memanggil int? melemparkan GetType(). Ini kerana walaupun kaedah maya ditindih, NullReferenceException tidak beroperasi pada nilai nullable berkotak, yang berpotensi mengakibatkan rujukan null. GetType()

Akhirnya, mari kita periksa kekangan generik dengan jenis kelas:

<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>
Walaupun seseorang mungkin mengharapkan contoh yang tidak nol

, ini boleh dielakkan menggunakan teknik yang melibatkan kelas proksi yang kembali T untuk panggilan null. Ini menonjolkan interaksi kompleks antara CLR dan tingkah laku runtime kod terurus. Contoh -contoh ini menunjukkan bahawa walaupun kod yang kelihatan mudah dapat mempamerkan tingkah laku yang tidak dijangka dalam senario tertentu, menekankan pentingnya ujian menyeluruh dan memahami mekanisme asas C# dan .NET.

Atas ialah kandungan terperinci Apakah Gelagat Mengejutkan yang Boleh Anda Hadapi dengan C# dan .NET Corner Cases?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn