6
votes

Comparer des expressions d'objet de type

D'accord, c'est probablement très simple, mais j'ai les "chèques" ci-dessous (pas en même temps) code> et le premier em> toujours fort > Évalue à vrai tant que le seconde em> semble fort> travailler. Cela se produit effectivement dans chaque endroit que la valeur de la ligne est un nombre ou BOOL (date semble bien ...) code>.

Si je marche dans le code dans déboges em> Il affiche la valeur de rangée ["PERSONID"] code> comme 162434 strong>, identique à tbxpersonid.editvalue code>. Est-ce juste une vérité basique et débutante sur la programmation que je manquais dans mon Hodge-Podge-Self-Education Code>? p>

Il semble que je coule em> tout en question à un chaîne code> d'abord, je vais bien je voudrais juste savoir si je suis correct et S'il y a une règle générale sur ce que types code>, je devrais faire cela pour? p>

ne fonctionne pas h2>
 if (row["PersonID"].ToString() != tbxPersonID.EditValue.ToString())
 {
     row["PersonID"] = tbxPersonID.EditValue;
 }

 if (row["CitizenFlag"].ToString() != chkCitizen.EditValue.ToString())
 {
     row["CitizenFlag"] = chkCitizen.EditValue;
     _whatChanged.Add("CitizenFlag");
 }


4 commentaires

N'est-ce pas simplement un cas de comparer des références? Bien que si la valeur d'édition est une INT, je ne comprends pas ce comportement. En tout cas, avez-vous essayé des angles ()?


Pouvez-vous rendre le titre plus général et consultable?


@DANA: Merci pour la modification @ Orsandu63: Bien sûr, des suggestions? Je ne pensais pas que les gens seraient bien intéressés par cela ....


@HENK: Merci! Si j'avais su surveiller le titre comme ça en premier lieu, je doute que j'aurais besoin de poser la question! :)


6 Réponses :


2
votes

Quel est le type d'EditValue ou la valeur droite? Le problème est probablement que EditValue n'est pas de type chaîne de type (c'est peut-être une sous-classe ou quelque chose), par conséquent, lorsque vous faites! = Ou == sur celui-ci, c'est faire une adresse de mémoire comparer au lieu du comparateur pour une chaîne par conséquent. de vrai


0 commentaires

18
votes

ligne ["PERSONID"] code> est d'objet de type, ce qui signifie que! = et == utilisera identité de référence em>. Fondamentalement, vous comparez des valeurs en boîte.

Si vous utilisez: P>

using System;

class Test
{
    static void Main()
    {
        object first = 2;
        object second = 2;

        // Compares reference equality: false
        Console.WriteLine(first == second);

        // Compares value equality: true
        Console.WriteLine(object.Equals(first, second));
    }
}


5 commentaires

Merci Jon, votre exemple fait un sens parfait! Je suis toujours malade que Dev est comme vous et d'autres personnes avec tant d'expérience sont disposés à arrêter et à expliquer quelque chose de si trivial à un débutant comme moi.


Aucun problème du tout - et je ne voudrais pas trop faire confiance à l'idée que j'ai "tant d'expérience". Vous devriez voir la somme des erreurs muettes que je fais chaque jour!


Merci, en tant que suivi, si ce n'est pas au-delà de la portée des commentaires ; Est-ce une meilleure idée d'utiliser objet.equals () vs .tostring () ?


@Jon, comme mal ombragé "certains"? :)


@Jage: Aargh. C'est terrible. Excuses sincères. @Refracted Paladin: Ce n'est pas une bonne idée de créer des représentations textuelles à moins que cela ne soit fondamentalement ce que vous voulez comparer. Cela dépend bien - voulez-vous (objet) 123L à égaler (objet) 123? (C'est-à-dire que la comparaison d'un encadré long avec une boîte en boîte.) Je dirais que, généralement si vous arrivez à ce stade, vous avez probablement d'autres problèmes.



1
votes

Je ne sais pas sur C #, mais dans certaines langues, le test d'égalité est différent pour les valeurs et les chaînes numériques. Alors, vous devez donc forcer une comparaison de chaîne avant que cela fonctionne.

Cela nous dit-il quelque chose?


0 commentaires

0
votes

Je suppose que le type de données de la ligne [] est quelque chose comme Int (ou Bool) et le chkcizen.editvalue est d'un type de données différent. Vous pouvez donc comparer '1' == 1 et avoir le résultat être faux.


0 commentaires

1
votes

Sans appel à Tostring () , votre code teste l'égalité sur deux objets plutôt que deux numéros, donc la raison pour laquelle il ne fonctionne pas.

En utilisant Tostring () VOUS RÉSISTREZ DE VOUS DIT Explicitement Le code Les valeurs obtiennent les valeurs à partir des objets ROND [] et EDITValue Objets.


0 commentaires

0
votes

"12345"! = 12345


0 commentaires