Cet extrait de code est de c # en profondeur la sortie de l'extrait de code ci-dessus est p> lorsque la méthode principale est Changé en P> True
True
3 Réponses :
a appris une nouvelle chose aujourd'hui. P>
Je suppose que Jon a dit dans l'une des questions, j'ai essayé de répondre. p>
Lorsque vous construisez une chaîne à l'aide de la concaténation, == Retournera true pour 2 chaînes de valeur correspondante, mais elles ne signalent pas la même référence (que je pensais, elle devrait être due à une chaîne interne. JON a pointé que la chaîne interne fonctionne. pour constants ou littéraux). P>
dans la version générique, il appelle l'objet.Refereferequens (qui est différent de ==. En cas de chaîne, == Comparaison de valeur). P>
En conséquence, la version concaténée renvoie false alors que la version constante (chaîne littérale) renvoie true. p>
Edit: Je pense que Jon doit être là pour expliquer cela de manière bien meilleure :)
Paresseux moi, j'ai acheté le livre mais je n'ai pas encore commencé à commencer dessus. : ( p>
Pas besoin de moi de l'expliquer moi-même - Marc a fait un excellent travail :) (et votre explication est bien aussi).
Sur le cas des chaînes, vous n'avez probablement pas l'intention d'utiliser l'égalité de référence. Pour accéder à l'égalité et aux inégalités des méthodes génériques, votre meilleur pari:
string name = "Jon"; string intro1 = "My name is " + name; string intro2 = "My name is " + name; Console.WriteLine(intro1 == intro2); Console.WriteLine(AreReferencesEqual(intro1, intro2));
@MARC: Merci, ça a été succinct
Cela n'a rien à voir avec la méthode générique, mais l'instanciation des chaînes
dans la première version de la principale que vous avez: p> qui crée 4 cordes. Deux d'entre elles compilent des constantes de temps à savoir "Jon" et "Mon nom" sont "" Toutefois, lors de l'initialisation d'Intro1 et d'Intro2, le compilateur ne peut pas dire que le nom est toujours jon et résout la valeur d'exécution de la valeur faisant une nouvelle chaîne pour chacune d'intro1 et d'intro2. p> dans la deuxième version p> Vous n'avez qu'une seule chaîne et c'est une constante de temps de compilation: "Mon nom est Jon" et vous affectez cette chaîne à la fois intro1 et intro2 et c'est pourquoi p> renvoie false dans le premier cas et vrai dans la seconde p> p>
N'oubliez pas que génériques i> ne sont pas modèles i>. Le compilateur surcharge une résolution sur l'opérateur == une fois que chaque construction générique utilise le résultat de cette analyse. Nous ne faisons aucune analyse pour comparer et une autre pour comparer et un tiers pour comparer . Nous faisons l'analyse une fois. Lors de la comparaison t à T où T est connu pour être une classe, la seule chose que nous pouvons faire est de faire == signifie "comparer par référence". Donc, cela signifie toujours "comparer par référence", peu importe ce que T est.