Rumah > pembangunan bahagian belakang > C++ > Apakah Gelagat Tidak Dijangka dan Kes Sudut Wujud dalam C# dan .NET?

Apakah Gelagat Tidak Dijangka dan Kes Sudut Wujud dalam C# dan .NET?

Susan Sarandon
Lepaskan: 2025-01-24 17:56:10
asal
376 orang telah melayarinya

What Unexpected Behaviors and Corner Cases Exist in C# and .NET?

c# dan .net: melancarkan kejutan tersembunyi

Pembangunan perisian sering mendedahkan tingkah laku yang tidak dijangka. C# dan .NET, sementara berkuasa, tidak terkecuali. Artikel ini meneroka beberapa kes sudut yang menarik yang boleh mencabar pemaju yang berpengalaman.

penciptaan rentetan: hasil kontraintuitive

Pertimbangkan coretan kod yang seolah -olah mudah ini:

string x = new string(new char[0]);
string y = new string(new char[0]);
Console.WriteLine(object.ReferenceEquals(x, y));
Salin selepas log masuk
output adalah

, bertentangan dengan jangkaan bahawa True mencipta objek yang berbeza untuk jenis rujukan. Runtime Bahasa Biasa (CLR) mengoptimumkan senario khusus ini, menggunakan semula contoh rentetan kosong yang sama. new

Jenis Generik dan Nullable : Misteri NullReferenceException

Kod berikut menunjukkan tingkah laku yang tidak dijangka:

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

    // This throws a NullReferenceException...
    Console.WriteLine(t.GetType());
}
Salin selepas log masuk
apabila

adalah T (mis., Nullable<T>), A int? berlaku apabila memanggil NullReferenceException. Ini kerana GetType() mengatasi kebanyakan kaedah, tetapi tidak Nullable<T>. Proses tinju semasa panggilan ke hasil yang tidak terobosan GetType() menghasilkan nilai null. GetType() Atribut proksi

dan kekangan : Menentang jangkaan new()

Ayende Rahien menyerlahkan senario yang serupa, namun lebih canggih:

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?");
}
Salin selepas log masuk
Kod ini, menghairankan, boleh gagal pernyataan. Dengan menggunakan atribut proksi (seperti

) yang memintas panggilan MyFunnyProxyAttribute dan pulangan new(), pernyataan itu boleh dilanggar. Ini menunjukkan potensi interaksi yang tidak dijangka antara tingkah laku runtime dan atribut tersuai. Contoh -contoh ini menyerlahkan kepentingan ujian menyeluruh dan pemahaman yang mendalam tentang kerja -kerja dalaman CLR untuk mengelakkan perangkap yang tidak dijangka dalam C# dan .NET Development. null

Atas ialah kandungan terperinci Apakah Gelagat Tidak Dijangka dan Kes Sudut Wujud dalam C# dan .NET?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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