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
Susan Sarandonasal
2025-01-24 17:56:10395semak imbas

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:

<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>
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:

<code class="language-csharp">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());
}</code>
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:

<code class="language-csharp">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?");
}</code>
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:
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