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
string x = new string(new char[0]); string y = new string(new char[0]); Console.WriteLine(object.ReferenceEquals(x, y)); // Prints True
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
static void Foo<T>() where T : new() { T t = new T(); Console.WriteLine(t.GetType()); // Throws NullReferenceException }
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
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?"); }
. 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!