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 :

Différence entre un (cast) et un System.Convert ?


Sujet :

C#

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 224
    Par défaut Différence entre un (cast) et un System.Convert ?
    Bonjour,

    je cherche à savoir quelle est la différence entre l'utilisation de casting (conversion explicite d'après la doc msdn) et un System.Convert en C#

    Mis à part la possibilité de perdre en précision (par exemple d'un double vers un int) dans les deux façons de faire :

    Y a t'il une différence de performance ?
    Comment C# .Net fait il réellement pour faire l'une ou l'autre ?
    (pourquoi ces deux façons de faire ?)

    Le cast passe t'il par une conversion en bit de données ? Qu'en est il pour le System.Convert ?

    Vaut'il mieux privilégier le System.Convert que le casting en général et pourquoi ?

    J'ai quelques pistes de la doc msdn :

    Vue d'ensemble des conversions :
    http://msdn2.microsoft.com/fr-fr/lib...99(VS.80).aspx

    System.Convert :
    http://msdn2.microsoft.com/fr-fr/lib...f1(VS.80).aspx

    Conversion explicite (casting) :
    http://msdn2.microsoft.com/fr-fr/lib...58(VS.80).aspx

    En parcourant les docs de msdn, je n'ai pas trouvé d'avertissement à ce sujet ni de documentation qui me donne vraiment la différence de performance entre les deux.

    Je pense que ces deux façons de faire sont identiques et que pour C# elles reviennent au même mais je ne suis absolument pas certain.

    Ya t'il des experts pour m'éclairer ?

    D'avance merci

  2. #2
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    peut-etre qu'avec les fonctions de Convert tu as davantages de possibilités
    voir certains cast impossibe sans passer par le Convert

    The Monz, Toulouse

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 224
    Par défaut
    c'est vrai j'avais remarqué ça aussi
    obligé de passé par un Convert parfois ..

    la question reste de savoir s'il y a différence de performance entre les deux etc.. et la raison du phénomène que tu viens de soulever

  4. #4
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    si tu veux "vraiment" voir si une différence existe, tu peux toujours regarder
    le code IL generé.. je crois de mémoire que dans le cas d'un Convert, il doit
    y avoir un try/catch qui enrobe la conversion... mais c'est de mémoire.. donc
    défaillant potentiellement

    The Monz, Toulouse

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 224
    Par défaut
    d'accord je vais regarder, mais qu'est ce que le "code IL" ?

    je n'ai jamais fait ça..

  6. #6
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    IL = Intermediate Language

    Grosso modo, c'est le code qui sera executé et qui est généré par le compilateur...

    Il faut savoir que le code est le mode pour du vb, c#..

    A titre indicatif, à partir de ce code, des outils gratuits comme Reflector sont
    capables de te faire le Code VB ou C# ou autres.. (c un outil pratique
    pour qui veut convertir du C# en VB.net... sans le faire manuellement...)

    Le code IL peut etre vu en utilisant l'outil "ILDASM.EXE" de M$... gratuit lui aussi.

    Regarde dans le msdn, tu y trouveras ton bonheur et des explications

    The Monz, Toulouse

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 224
    Par défaut
    ok merci beaucoup,

    je vais regarder ça dans les jours à venir et je reviendrai donner des nouvelles

    merci

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 224
    Par défaut
    Pour en revenir à ma question d'hier,

    je me pose aussi la question sur la différence entre un cast (string) et un toString() dans certain cas.

    Par exemple si je fais un sqlCommand.executeScalar() pour récupérer une donnée de ma base de données, executeScalar() me retourne un "object" or je sais que c'est un string que je suis censé obtenir et je fais donc un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (string)maSqlCommand.executeScalar();
    mais .. et pourquoi pas un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maSqlCommand.executeScalar().ToString()
    ?

    dans les deux cas ça fonctionne mais j'aurai tendance à dire que le cast explicite (string) est mieux car on est sur d'obtenir notre donnée telle qu'elle alors que la méthode ToString() est censée "représenter" l'objet en string..

    de mémoire en java, les ToSting() retournait parfois l'adresse du pointeur de l'objet...

    mais de là à dire qu'un cast explicite (string) est plus performant ou pas qu'un ToString() je ne sais pas du tout.

    si quelqu'un a des eclaircicessement à ce sujet..

    bon we

  9. #9
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Par défaut
    Salut .

    Pour répondre totalement à la question .

    Un cast n'est qu'une façon de forcer le type d'un objet. C'est a dire que tu vas brutalement et sans aucune précaution tenter de transformer un objet quelconque en un autre. Tout ce passe bien si tu esasi de transformer un objet qui est par exemple une string en string, les types sont les même .

    Convert permet d'éviter de faire ça "a la barbare". Il va vérifier que le cast est possible, et ensuite seulement faire la transformation. De plus il fait des vérification des transformations en applicant par exemple des réglès de transformation d'un double en float pour ne pas fausser la valeur du float.

    Pour ce qui est de ta question sur le (string) et .ToString() il faut savoir que si le résultat est le même c a d que tu as une string au final, les conséquences et la démarche sont absolument différentes.
    Dans un cas tu vas caster un objet, (voir au dessus pour les explications) et dans tu vas effectivement demander sa représentation soit forme de string. Si ta commande te renvoi un objet complexe comme une instance de "MaClasse" et que la méthode ToString n'est pas redéfinie dans cette classe tu aura une belle chaine qui ne veut rien dire ...

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 224
    Par défaut
    Bonjour dev01,

    merci beaucoup pour ta réponse.

    Penses tu qu'il vaut mieux privilégier les Convert dans son code autant que possible et éviter les (cast) ?

  11. #11
    Membre expérimenté Avatar de scifire
    Inscrit en
    Juillet 2004
    Messages
    226
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 226
    Par défaut
    Eviter les deux si possible Previligier les classes abrastraites, les generiques etc. Reviser le code aussi parce que si tu as declare
    et dans le code tu fais un cast ou un Convert() peut-etre c'est mieux de penser changer le type de variable.
    Bien sur ca ne veut pas dire qu'on doit eliminer ces operation a tout prix
    Par exemple dans cas il n'est pas possible de supprimer le cast
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                using (SqlCommand cmd = ...)
                {
                    cmd.Connection = ...;
                    cmd.CommandType = CommandType.Text;
                    cmd.CommandText = "SELECT COUNT(*) FROM TABLE";
                    int total = (int)cmd.ExecuteScalar();
                    ...
                }

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 224
    Par défaut
    salut,

    je n'ai pas encore eu le temps de voir ce que me proposait theMonz31 (beaucoup de boulot), mais je voulais vous faire remarquer une chose intéressante :


    ---> caster un objet null renvoie une erreur (l'objet a une reference null, impossible de caster)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    object monObjet = null;
    int nb = (int)monObjet;
    vous enverra une erreur


    ---> par contre un Convert nous renverra un 0 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    object monObjet = null;
    int nb = Convert.ToInt32(monObjet);
    et nb vaudra 0 !

    ça pourrait être bien pratique

Discussions similaires

  1. Différence entre le compte sys et system
    Par shayro19 dans le forum Administration
    Réponses: 2
    Dernier message: 04/03/2015, 17h12
  2. Les différences entre les cast c++ et c
    Par NoIdea dans le forum Débuter
    Réponses: 13
    Dernier message: 01/07/2010, 10h18
  3. Différence entre source donne utilisateur et systeme
    Par rec82 dans le forum Bases de données
    Réponses: 3
    Dernier message: 14/01/2009, 12h52
  4. [DBA]Différence entre : SYSTEM, INTERNAL, SYSDBA
    Par Isabella dans le forum Oracle
    Réponses: 10
    Dernier message: 15/02/2006, 13h49
  5. Réponses: 5
    Dernier message: 03/05/2005, 18h22

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