IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

type et operateur "is"


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut type et operateur "is"
    Une chose que j'ai toujours trouvé fasstidieuse en C# c'est le test du type d'un objet

    Par exemple pour savoir si un objet est de type numerique il faut faire une cascade de test Single, double, int et j'en passe

    Les operateurs sont aussi confusionnant entre TypeOf, GetType (j'en passe aussi)


    J'ai donc DEUX questions
    1- Quelqu'un connait il une maniere simple est concise de determiner si un type est numerique


    2- Dans quel cas l'operateur is peut-il ou doit il etre utilisé (tres dificille de trouver de la doc sur l'operateur is (presque aussi compliqué que '?' ou '??'

    Par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // Ceci est correct
            if (type == typeof(Single) || type == typeof(double))
            {
            }
    // Ceci compile mais ne donne pas le resultat attendu
            if (type is Single || type is double)
            {
            }
    merci aux avis des guru en la matière

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Par défaut
    Salut,

    Pour la doc, tu avais déjà eu les liens ici :
    http://www.developpez.net/forums/d90...ype-is-autres/
    Tu aurais pu poursuivre sur le même post au passage .

    Sinon pour ton code exemple. Tu effectues le deuxième test de la mauvaise façon.
    Avec typeof, tu peux effectuer un test sur un Type, mais pas avec is. Tu testes l'objet / la valeur en question.

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            if (type == typeof(Single) || type == typeof(double))
            {
            }
     
            if (valeur is Single || valeur is double)
            {
            }

    ta variable 'type' pourrait être :

    On peut ajouter l'opérateur as aussi : http://msdn.microsoft.com/en-us/libr...8VS.71%29.aspx (as a quand même sa particularité)
    et d'autres encore (TypeHandle, GetTypeHandle,...)

    Après quelle différence y a-t-il entre ces différentes façon de faire... Je dirais un gain de temps assez négligeable au final.
    Il y a ce lien qui en parle : http://blogs.msdn.com/b/vancem/archi...01/779503.aspx

  3. #3
    Membre émérite Avatar de chamamo
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    588
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 588
    Par défaut
    un lien qui résume bien la différence et la performance des différents tests

  4. #4
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par olibara Voir le message
    1- Quelqu'un connait il une maniere simple est concise de determiner si un type est numerique
    Pour ce cas particulier, tu peux partir du principe que tout type numérique peut être casté en double; donc tu peux tenter, par exemple, de convertir en string puis parser en double

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    double v;
    bool isNumeric = double.TryParse(maValeurQuiEstPtetBenNumerique.ToString(), out v);

  5. #5
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Citation Envoyé par binoo
    Pour la doc, tu avais déjà eu les liens ici :
    http://www.developpez.net/forums/d90...ype-is-autres/
    Tu aurais pu poursuivre sur le même post au passage
    Tiens je l'avais oublié celui la

    Mais c'est vrai que ca fait partie des deux trois truc que je trouve casse pied et auquels je ne me fait pas

    Parmis ceux la
    - les test de type
    - les regexp
    - les les DateTimePicker avec null Date

  6. #6
    Membre chevronné Avatar de MetalGeek
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 412
    Par défaut
    Salut,

    pour déterminer si un objet est d'un type numérique, en principe le plus performant est d'utiliser la propriété TypeCode de son type.

    Ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public static bool IsNumeric(object value)
    {
        var typeCode = (int)Type.GetTypeCode(value.GetType());
     
        return typeCode >= 5 && typeCode <= 15;
    }
    Ceci fonctionne grâce à la manière dont est définie l'énumération :


    TypeCode


    Pour les puristes, ce n'est pas optimum niveau fiabilité car rien ne permet d'être sûr et certain que Microsoft ne changera pas l'implémentation ou l'ordre des valeurs d'énumération de TypeCode, mais bon, c'est quand même très peu probable... D'ailleurs, tu peux aussi éventuellement utiliser un switch, la différence en termes de perfs sera ridicule.

  7. #7
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Merci MetalGeek

    Ca me semble une tres bonne suggestion

+ Répondre à la discussion
Cette discussion est résolue.

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo