Rumah >pembangunan bahagian belakang >C++ >Kenapa beberapa C# dan .NET Corner Cases menentang jangkaan?

Kenapa beberapa C# dan .NET Corner Cases menentang jangkaan?

Barbara Streisand
Barbara Streisandasal
2025-01-24 18:02:14761semak imbas

Why Do Some C# and .NET Corner Cases Defy Expectations?

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

Pertimbangkan kod ini yang seolah -olah mudah:

<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

Jenis -jenis yang tidak dapat dipertahankan dan

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()

kes NULL

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!

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