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 :

Casse-têtes en C#, traduction de l'article de Jon Skeet


Sujet :

C#

  1. #1
    Rédacteur

    Avatar de Jean-Michel Ormes
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    1 838
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 838
    Points : 4 574
    Points
    4 574
    Par défaut Casse-têtes en C#, traduction de l'article de Jon Skeet
    Cette discussion est destinée à recueillir vos commentaires sur l'article Casse-têtes en C# (traduction de l'article C# Brainteasers de Jon Skeet)

    Régulièrement, je tombe sur une situation intéressante en C# qui donne des résultats surprenants. Cette page contient une liste d'exemples. Dans les exemples où il n'y a qu'un bout de code, nous supposerons que celui-ci est dans la méthode Main. Afin de ne pas tomber accidentellement sur les résultats avant que vous ne le souhaitiez, j'ai mis les réponses sur une autre page.

  2. #2
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    Bonjour,

    C'est chouette que vous traduisiez les articles de John Skeet, ils sont souvent très pertinents.

    Par contre une petite erreur s'est glissé dans la traduction au niveau des réponses. Concernant la dernière devinette
    mais à ce stade, c'est effectivement un choix entre string x et params string [] x.
    devrait etre
    mais à ce stade, c'est effectivement un choix entre object x et params string [] x.

  3. #3
    Rédacteur

    Avatar de Jean-Michel Ormes
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    1 838
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 838
    Points : 4 574
    Points
    4 574
    Par défaut
    Merci, j'ai pris en compte ta correction

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2008
    Messages : 231
    Points : 359
    Points
    359
    Par défaut
    Bonjour,

    je me pose une question très précise sur le problème "Print, Print, Print ..."
    je comprend pourquoi le 10*10, ma question porte sur la déclaration de "i".

    Elle est déclaré dans le For, et normalement on ne peut plus l'utilisé en dehors du For.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for (int i=0; i < 10; i++)
    {
          printers.Add(delegate { Console.WriteLine(i); });
    }
    Console.WriteLine(i);
    Ce code est impossible.
    Alors comment on peut l'utiliser dans la boucle du dessous ? J'aimerai comprendre le fonctionnement de la CLR derrière.
    "Une belle citation est un diamant au doigt de l'homme d'esprit et un caillou dans la main d'un sot."
    Joseph Roux

  5. #5
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Bonjour,

    C'est expliqué sur le lien variables capturées juste en dessus de l'exemple
    Does the variable even exist outside MakeDelegate? Well, the answer is yes - because the compiler compiles it into an instance variable in a new type behind the scenes. If you compile the above and look at it with ildasm, you'll see that there actually isn't a Random local variable in MakeDelegate at all, as far as the runtime is concerned! Instead, there's a local variable of a nested type with some compiler-generated name (the time I compiled it, the name was <>c__DisplayClass1).
    Ou en français dans le texte, une classe est générée et stocke ces captures dans des champs qui sont initialisés dans son constructeur par les valeurs locales (et donc non perdues lors de la sortie de la portée du bloc).

    Enfin quelqu'un l'expliquera sans doute mieux que moi

    Cordialement !
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2008
    Messages : 231
    Points : 359
    Points
    359
    Par défaut
    Merci c'est l'explication que j'attendai
    Je n'avais jamais eu le détail du fonctionnement
    "Une belle citation est un diamant au doigt de l'homme d'esprit et un caillou dans la main d'un sot."
    Joseph Roux

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 6
    Points : 8
    Points
    8
    Par défaut
    Une petite remarque concernant ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    double d1 = 1.000001;
    double d2 = 0.000001;
    Console.WriteLine((d1-d2)==1.0);
    Le compilateur verra que le résultat diffère, avec en sortie "False".
    Cependant, en modifiant légèrement ce bout de code


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      
    double d1 = 1.0000001;
    double d2 = 0.0000001;
    Console.WriteLine((d1-d2)==1.0);
    On obtiendra bien "True" en sortie.

    Que peut-on en déduire ?

  8. #8
    Membre du Club Avatar de Tryp'
    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 48
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par Noze_ Voir le message
    Une petite remarque concernant ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    double d1 = 1.000001;
    double d2 = 0.000001;
    Console.WriteLine((d1-d2)==1.0);
    Le compilateur verra que le résultat diffère, avec en sortie "False".
    Cependant, en modifiant légèrement ce bout de code


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      
    double d1 = 1.0000001;
    double d2 = 0.0000001;
    Console.WriteLine((d1-d2)==1.0);
    On obtiendra bien "True" en sortie.

    Que peut-on en déduire ?
    C'est une histoire de stockage des nombres flottants en binaire.

    Un nombre entier est représenté par des 0 ou des 1, et, de droite à gauche, un bit à 1 a une valeur de 2^n (où n est sa position à partir de la droite).

    Par exemple :
    1101, de droite à gauche :
    1 * 2^0 = 1
    0 * 2^1 = 0
    1 * 2^2 = 4
    1 * 2^3 = 8
    Donc 1101 en binaire vaut : 1 + 4 + 8 = 13

    Pour la partie décimale, c'est presque pareil de gauche à droite. Sauf que cette fois ci, on utilise les puissances négatives de 2.

    0.011, de gauche à droite (on oublie la partie entière) :
    0 * 2^-1 = 0
    1 * 2^-2 = 0.25
    1 * 2^-3 = 0.125
    Donc 0.011 en binaire vaut : 0.25 + 0.125 = 0.325

    Pour répondre donc à ta question, il arrive que certains nombres ne peuvent pas être représentés correctement sur 32 bits (ou 64 bits), d'où la présence de certaines incohérences comme celle-ci. Il n'y a juste pas assez de bits disponibles pour cela. Tout est histoire de puissance de 2.

    En espérant avoir été clair !

Discussions similaires

  1. C# et beforefieldinit, traduction de l'article de Jon Skeet
    Par Jérôme Lambert dans le forum C#
    Réponses: 1
    Dernier message: 30/04/2012, 08h53
  2. Réponses: 8
    Dernier message: 11/04/2012, 10h07
  3. Réponses: 6
    Dernier message: 04/04/2012, 11h20
  4. Réponses: 0
    Dernier message: 31/03/2012, 16h48
  5. Réponses: 4
    Dernier message: 05/03/2012, 17h44

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