Maison >développement back-end >C++ >Quels sont les cas inattendus en C# et .NET ?
Dévoiler l'inattendu : les bizarreries cachées de C# et .NET
Cet article explore certains comportements surprenants en C# et .NET, démontrant la nécessité de tests rigoureux et d'un examen attentif des cas extrêmes.
Un exemple intrigant concerne les stages en chaîne. Considérez cet extrait de code :
<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>
Intuitivement, on pourrait anticiper False
comme résultat. Cependant, x
et y
sont internés comme des chaînes vides, conduisant à un résultat True
surprenant.
Un autre comportement inattendu survient avec les types nullables et la méthode GetType()
. Si T
est un type nullable et que toutes les méthodes remplacées (sauf GetType()
) sont implémentées, appeler GetType()
sur une instance en boîte peut lancer un NullReferenceException
.
<code class="language-csharp">static void Foo<T>() where T : new() { T t = new T(); // ... // This throws a NullReferenceException... Console.WriteLine(t.GetType()); }</code>
De plus, les contraintes génériques où T
est un type référence et nécessite une valeur non nulle (T : class, new()
) présentent un défi subtil. Bien que la contrainte new()
vise à garantir une instance non nulle, elle peut être contournée en utilisant l'indirection, par exemple, avec un attribut proxy personnalisé qui renvoie null pour les instances nouvellement créées :
<code class="language-csharp">[MyFunnyProxy] class MyFunnyType : ContextBoundObject { }</code>
Ces exemples illustrent le potentiel de comportement inattendu dans les frameworks C# et .NET. Des tests approfondis et une connaissance approfondie des cas extrêmes sont essentiels pour un développement d'applications robuste et fiable.
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!