Rumah >pembangunan bahagian belakang >C++ >Kenapa beberapa C# dan .NET Corner Cases menentang jangkaan?
meneroka tingkah laku yang tidak dijangka dalam C# dan .net
Bangunan aplikasi yang mantap memerlukan pemahaman yang mendalam tentang kes -kes kelebihan. C# dan .NET, sementara berkuasa, mempersembahkan beberapa senario mengejutkan yang mencabar andaian yang sama. Mari kita periksa beberapa contoh yang menggambarkan tingkah laku yang luar biasa ini:
Bila tidak menghasilkan objek baru new
<code class="language-csharp">string x = new string(new char[0]); string y = new string(new char[0]); Console.WriteLine(object.ReferenceEquals(x, y)); // Prints True</code>seseorang mungkin mengharapkan
sentiasa membuat objek yang berbeza untuk jenis rujukan. Walau bagaimanapun, pengendalian rentetan kosong C#membawa kepada new
dan x
merujuk objek yang sama.
y
NullReferenceException
Coretan kod ini menyoroti interaksi yang membingungkan dengan jenis yang tidak dapat dibatalkan:
Walaupun
<code class="language-csharp">static void Foo<T>() where T : new() { T t = new T(); Console.WriteLine(t.GetType()); // Throws NullReferenceException }</code>dimulakan, memanggil
melemparkan t
. Ini kerana jika GetType()
adalah jenis yang boleh dibatalkan (seperti NullReferenceException
), tinju tersirat ke T
boleh menghasilkan nilai null, menyebabkan pengecualian apabila int?
dipanggil pada null berkotak. object
GetType()
contoh new
Senario ini menunjukkan kemungkinan yang kurang intuitif:
Kekangan mencadangkan
<code class="language-csharp">public static void CanThisHappen<T>() where T : class, new() { var instance = new T(); // new() on a ref-type; should be non-null Debug.Assert(instance != null, "How did we break the CLR?"); }</code>adalah jenis rujukan instantiible dengan
. Walau bagaimanapun, teknik seperti remoting (mis., Menggunakan proksi yang mengembalikan null) boleh memintas jangkaan ini, yang membawa kepada penegasan yang gagal. Ini menyoroti kerumitan yang diperkenalkan apabila berurusan dengan ciri -ciri canggih seperti remoting. T
Atas ialah kandungan terperinci Kenapa beberapa C# dan .NET Corner Cases menentang jangkaan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!