Exploration des comportements inattendus en C # et .NET
La construction d'applications robustes nécessite une compréhension approfondie des cas de bord. C # et .NET, bien que puissant, présentent des scénarios surprenants qui remettent en question les hypothèses communes. Examinons quelques exemples illustrant ces comportements inhabituels:
lorsque new
ne produit pas un nouvel objet
Considérez ce 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)); // Prints True</code>
On peut s'attendre à ce que new
crée toujours des objets distincts pour les types de référence. Cependant, la gestion spéciale de C # des chaînes vides conduit à x
et y
référençant le même objet.
types nullables et les NullReferenceException
Cet extrait de code met en évidence une interaction déroutante avec les types nullables:
<code class="language-csharp">static void Foo<T>() where T : new() { T t = new T(); Console.WriteLine(t.GetType()); // Throws NullReferenceException }</code>
Même si t
est initialisé, l'appel GetType()
lance un NullReferenceException
. En effet, si T
est un type nullable (comme int?
), la boxe implicite à object
peut entraîner une valeur nul, provoquant l'exception lorsque GetType()
est appelé sur le Null en boîte.
Le cas de l'instance nul new
Ce scénario montre une possibilité moins intuitive:
<code class="language-csharp">public static void CanThisHappen<T>() where T : class, new() { var instance = new T(); // new() on a ref-type; should be non-null Debug.Assert(instance != null, "How did we break the CLR?"); }</code>
Les contraintes suggèrent que T
est un type de référence instanable avec new
. Cependant, des techniques telles que le télécommande (par exemple, l'utilisation d'un proxy qui renvoie NULL) peut contourner cette attente, ce qui entraîne l'échec de l'échec de l'affirmation. Cela met en évidence les complexités introduites lorsqu'ils traitent de fonctionnalités avancées comme le télécommande.
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!