2009-03-11 5 views
1

Je travaille actuellement sur une structure arborescente de nœuds où chaque nœud devrait pouvoir dire s'il est équivalent à un autre nœud. Chaque classe de noeud est une sous-classe de QueryNode. Pour vérifier l'équivalence, les nœuds comparer si elles sont de la même sous-classe et ont des valeurs membres égales (bien sûr, il y a plus de choses en jeu, mais c'est la partie qui me bugs):Existe-t-il une alternative à la vérification de type dans ce code C#?

class VersionNode : QueryNode 
{ 
    VersionModifier m_versionModifier; 

    internal VersionModifier VersionModifier 
    { get { return this.m_versionModifier; } } 

    // ... 

    protected override bool AreMembersEquivalent(QueryNode other) 
    { 
     VersionNode otherNodeAsVersionNode = other as VersionNode; 

     if (otherNodeAsVersionNode == null) 
      return false; 
     else 
      return (this.m_versionModifier == otherNodeAsVersionNode.VersionModifier); 
    } 
} 

Je pense que ce ne peut pas être une solution optimale car elle implique le moulage. Y a-t-il une manière plus élégante de faire ceci?

+0

Le code regardera plus « élégant » si vous faites votre taille onglet 2 places, et raccourcissez vos noms de variables locales. – leppie

+0

BTW vous avez un accès direct à m_versionModifier de l'autre instance. Pas besoin d'aller via une propriété :) Le 'ceci' est également inutile. – leppie

+0

Je préfère un code verbeux à un look élégant depuis la lecture du Common Lisp Ansi de Paul Graham. –

Répondre

2

La réponse courte est non. Casting (et même unboxing dans une certaine mesure) n'est pas cher.

0

Je suis à peu près sûr que la distribution étrange ne va pas vous faire beaucoup de mal. Que fais-tu, la modélisation physique?

+0

Écrire des tests pour certaines optimisations mineures sur les requêtes de base de données. Merci de votre aide! –

+0

Oui, ce genre de chose est un hareng rouge alors. Vos gains réels sont ailleurs. – Quibblesome

1

Vous pouvez faire:

protected override bool AreMembersEquivalent(QueryNode other) 
    { 
     if (!(other is VersionNode)) 
      return false; 
     ... 
} 
+0

Cela n'aide pas ici, car vous devez manipuler "other" en tant que VersionNode pour accéder à sa propriété. Cast sûr avec "comme" est le bon chemin à parcourir. –

+0

D'accord, vous devrez le lancer quand même si vous continuez. Il suffit de le jeter comme une alternative. Ce qui est amusant, c'est que l'opérateur 'is' et 'as' sont tous les deux implémentés comme l'opcode isinst IL, donc il n'y a vraiment aucune différence. –

0

Ce n'est pas plus élégant, mais il est peut-être plus explicite:

protected override bool AreMembersEquivalent(QueryNode other) 
{ 
    if (GetType() == other.GetType()) 
    { 
     return (VersionModifier == other.VersionModifier); 
    } 
    return false; 
}  
+0

Et ne fonctionne pas pour l'héritage. – leppie

+0

Que voulez-vous dire? Ce code vous indiquera si deux objets héritant de QueryNode sont du même type. –

Questions connexes