Rumah >pembangunan bahagian belakang >C++ >Apakah beberapa tingkah laku yang tidak dijangka dan kes sudut di C# dan .NET?
Meneroka sudut pelik dari C#dan .NET Rangka kerja
Dalam pembangunan perisian, sering terdapat beberapa margin yang membingungkan. Artikel ini akan meneroka beberapa tepi yang paling pelik dalam kerangka C#dan .NET untuk mendedahkan tingkah laku yang tidak normal.
rentetan rentetan tidak normal
Pertimbangkan serpihan kod berikut:
Dalam intuitif, kami mengharapkan output menjadi palsu, kerana kata kunci "baru" biasanya memperuntukkan ruang untuk objek baru. Anehnya, dalam versi rangka semua ujian, kod ini output benar. Walaupun peraturan harus selalu membuat objek baru, ini telah menjadi kes khas.
<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>boleh mengosongkan jenis abnormal
Kod ini lebih lanjut menggambarkan kerumitan C#:
Misteri terletak pada jenis T. Untuk mengumumkannya, kita mesti menyemak kod dengan teliti.Struktur mewakili jenis kekosongan. Oleh itu, apabila dipanggil, nilai kosong boleh ditukarkan secara paksa ke
(hasilnya adalah null), yang membawa kepada<code class="language-csharp">static void Foo<T>() where T : new() { T t = new T(); // ... (其他操作) // 此行引发NullReferenceException Console.WriteLine(t.GetType()); }</code>.
Nullable<T>
contoh kelas GetType()
GetType()
object
Keadaan kelebihan lain yang membingungkan muncul dalam kod berikut, di mana t terhad kepada jenis rujukan: NullReferenceException
melalui reka bentuk kejuruteraan yang sangat baik, anda boleh menggunakan kaedah tidak langsung yang serupa dengan panggilan jauh untuk memusnahkan kod ini:
dengan mendefinisikan atribut agensi tersuai danpanggilan untuk mengembalikan null, pernyataan dalam
dimusnahkan, yang menunjukkan fleksibiliti dan perangkap yang besar semasa bahasa C#dan .NET.<code class="language-csharp">private static void Main() { CanThisHappen<MyFunnyType>(); } public static void CanThisHappen<T>() where T : class, new() { var instance = new T(); Debug.Assert(instance != null, "我们是如何破坏CLR的?"); }</code>
Atas ialah kandungan terperinci Apakah beberapa tingkah laku yang tidak dijangka dan kes sudut di C# dan .NET?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!