Maison > développement back-end > C++ > Quels comportements inattendus et quels cas particuliers existent en C# et .NET ?

Quels comportements inattendus et quels cas particuliers existent en C# et .NET ?

Susan Sarandon
Libérer: 2025-01-24 17:56:10
original
300 Les gens l'ont consulté

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

C# et .NET : dévoiler des surprises cachées

Le développement de logiciels révèle souvent des comportements inattendus. C# et .NET, bien que puissants, ne font pas exception. Cet article explore quelques cas particuliers intrigants qui peuvent défier même les développeurs expérimentés.

Création de chaînes : un résultat contre-intuitif

Considérez cet extrait de code apparemment simple :

<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>
Copier après la connexion

Le résultat est True, contredisant l'attente selon laquelle new crée des objets distincts pour les types référence. Le Common Language Runtime (CLR) optimise ce scénario spécifique, en réutilisant la même instance de chaîne vide.

Types génériques et Nullable : un mystère NullReferenceException

Le code suivant démontre un autre comportement inattendu :

<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>
Copier après la connexion

Lorsque T est Nullable<T> (par exemple, int?), un NullReferenceException se produit lors de l'appel de GetType(). En effet, Nullable<T> remplace la plupart des méthodes, mais pas GetType(). Le processus de boxe lors de l'appel au GetType() non remplacé donne une valeur nulle.

Attributs du proxy et new() Contrainte : défier les attentes

Ayende Rahien a mis en avant un scénario similaire, mais plus sophistiqué :

<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>
Copier après la connexion

Ce code, étonnamment, peut faire échouer l'assertion. En utilisant un attribut proxy (comme MyFunnyProxyAttribute) qui intercepte l'appel new() et renvoie null, l'assertion peut être violée. Cela démontre le potentiel d’interactions inattendues entre le comportement d’exécution et les attributs personnalisés. Ces exemples soulignent l'importance de tests approfondis et d'une compréhension approfondie du fonctionnement interne du CLR pour éviter les pièges inattendus dans le développement C# et .NET.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal