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

Quels sont les comportements inattendus et les cas particuliers en C# et .NET ?

DDD
Libérer: 2025-01-24 18:14:10
original
665 Les gens l'ont consulté

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

Explorez les coins étranges de C# et du framework .NET

Dans le développement de logiciels, nous rencontrons souvent des cas extrêmes déroutants. Cet article explorera certains des cas extrêmes les plus bizarres en C# et dans le framework .NET, révélant leur comportement anormal.

Exception résidente de chaîne

Considérez l'extrait de code suivant :

<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

Intuitivement, nous nous attendrions à ce que le résultat soit False puisque le mot-clé "new" alloue généralement de l'espace pour un nouvel objet. Étonnamment, ce code renvoie True dans toutes les versions du framework testées. Bien que la spécification indique que de nouveaux objets doivent toujours être créés, cela devient un cas particulier.

Exception de type nullable

Ce code illustre davantage la complexité du C# :

<code class="language-csharp">static void Foo<T>() where T : new()
{
    T t = new T();
    // ... (其他操作)

    // 此行引发NullReferenceException
    Console.WriteLine(t.GetType());
}</code>
Copier après la connexion

Le mystère réside dans le type T. Pour le découvrir, nous devons examiner attentivement le code. La structure Nullable<T> représente un type de valeur nullable, qui remplace la plupart des méthodes membres, mais ne remplace pas GetType(). Ainsi, lorsque GetType() est appelé, la valeur nullable est convertie en object (résultant en null), ce qui donne NullReferenceException.

Astuce d'instanciation de classe

Un autre cas limite déroutant se produit dans le code suivant, où T est limité à un type référence :

<code class="language-csharp">private static void Main() {
    CanThisHappen<MyFunnyType>();
}

public static void CanThisHappen<T>() where T : class, new() {
    var instance = new T();
    Debug.Assert(instance != null, "我们是如何破坏CLR的?");
}</code>
Copier après la connexion

Grâce à une excellente conception technique, ce code peut être déchiffré à l'aide de méthodes indirectes similaires aux appels à distance :

<code class="language-csharp">class MyFunnyProxyAttribute : ProxyAttribute {
    // ... (重写)
}

[MyFunnyProxy]
class MyFunnyType : ContextBoundObject { }</code>
Copier après la connexion

En définissant un attribut de proxy personnalisé et en redirigeant l'appel new() pour renvoyer null, l'assertion dans CanThisHappen est rompue, démontrant l'énorme flexibilité et les pièges potentiels du langage C# et du runtime .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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal