Heim > Backend-Entwicklung > C++ > Welche unerwarteten Verhaltensweisen und Eckfälle gibt es in C# und .NET?

Welche unerwarteten Verhaltensweisen und Eckfälle gibt es in C# und .NET?

Susan Sarandon
Freigeben: 2025-01-24 17:56:10
Original
377 Leute haben es durchsucht

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

C# und .NET: Enthüllung versteckter Überraschungen

Softwareentwicklung offenbart oft unerwartete Verhaltensweisen. C# und .NET sind zwar leistungsstark, bilden aber keine Ausnahme. In diesem Artikel werden einige interessante Eckfälle untersucht, die selbst erfahrene Entwickler vor Herausforderungen stellen können.

String-Erstellung: Ein kontraintuitives Ergebnis

Betrachten Sie diesen scheinbar einfachen Codeausschnitt:

string x = new string(new char[0]);
string y = new string(new char[0]);
Console.WriteLine(object.ReferenceEquals(x, y));
Nach dem Login kopieren

Die Ausgabe ist True und widerspricht der Erwartung, dass new unterschiedliche Objekte für Referenztypen erstellt. Die Common Language Runtime (CLR) optimiert dieses spezielle Szenario, indem sie dieselbe leere Zeichenfolgeninstanz wiederverwendet.

Generische Typen und Nullable<T>: Ein NullReferenceException-Rätsel

Der folgende Code zeigt ein weiteres unerwartetes Verhalten:

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());
}
Nach dem Login kopieren

Wenn T Nullable<T> ist (z. B. int?), tritt beim Aufruf von NullReferenceException ein GetType() auf. Dies liegt daran, dass Nullable<T> die meisten Methoden überschreibt, nicht jedoch GetType(). Der Boxing-Prozess während des Aufrufs des nicht überschriebenen GetType() führt zu einem Nullwert.

Proxy-Attribute und die new() Einschränkung: Erwartungen trotzen

Ayende Rahien hat ein ähnliches, aber komplexeres Szenario hervorgehoben:

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?");
}
Nach dem Login kopieren

Überraschenderweise kann dieser Code die Behauptung nicht erfüllen. Durch die Verwendung eines Proxy-Attributs (wie MyFunnyProxyAttribute), das den new()-Aufruf abfängt und null zurückgibt, kann die Behauptung verletzt werden. Dies zeigt das Potenzial für unerwartete Wechselwirkungen zwischen Laufzeitverhalten und benutzerdefinierten Attributen. Diese Beispiele verdeutlichen, wie wichtig gründliche Tests und ein tiefes Verständnis des Innenlebens der CLR sind, um unerwartete Fallstricke bei der C#- und .NET-Entwicklung zu vermeiden.

Das obige ist der detaillierte Inhalt vonWelche unerwarteten Verhaltensweisen und Eckfälle gibt es in C# und .NET?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage