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
Lepaskan: 2025-01-24 18:07:10
asal
511 orang telah melayarinya

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>
Salin selepas log masuk
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>
Salin selepas log masuk
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>
Salin selepas log masuk
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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan