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

Dotnet Discussion :

C# compréhension sur deux écritures


Sujet :

Dotnet

  1. #1
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    novembre 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : novembre 2015
    Messages : 22
    Points : 17
    Points
    17
    Par défaut C# compréhension sur deux écritures
    Bonjour,
    Je ne connais pas le C# mais j'essai d'utiliser un programme en C# pour le réécrire en Tcl/Tk.
    J'ai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public Vector3d Row0;
    public Vector3d Row1;
    public Vector3d Row2;
     
    public Matrix3d ClearScale()
            {
                var m = this;
                m.Row0 = m.Row0.Normalized();
                m.Row1 = m.Row1.Normalized();
                m.Row2 = m.Row2.Normalized();
                return m;
            }
    Puis je l'écrire de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
            public Matrix3d ClearScale()
            {
                var m = this;
                Row0 = Row0.Normalized();
                Row1 = Row1.Normalized();
                Row2 = Row2.Normalized();
                return m;
            }
    Ou pas du tout... Je ne comprends pas pourquoi l'auteur la écrit de cette façon là ? Il y a probablement une raison, mais je ne vois pas laquelle
    Merci

  2. #2
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    février 2010
    Messages
    4 019
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2010
    Messages : 4 019
    Points : 7 191
    Points
    7 191
    Billets dans le blog
    1
    Par défaut
    Je ne comprends pas du tout le pourquoi du comment du "var m = this;"

    Ensuite, les deux écritures me semble passablement identiques, sauf éventuellement peut-être dans certains cas obscurs d'héritage, et encore, je ne vois pas trop...

    Aussi, je ne vois franchement pas l'intérêt de faire un "return this;".
    Qu'on fasse un "return this.Clone();" pourquoi pas... mais du moment qu'on a modifié l'instance, autant continuer à utiliser l'instance, pas une nouvelle référence à la même instance !

    Dans tous les cas, je réécrirais :
    Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public void ClearScale()
    {
        Row0 = Row0.Normalized();
        Row1 = Row1.Normalized();
        Row2 = Row2.Normalized();
    }

    Et depuis l'appelant :

    Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Matrix3d matrice = new Matrix3d();
     
    matrice.ClearScale();
     
    // Puis on continue d'utiliser matrice au lieu d'une autre référence...
    On ne jouit bien que de ce qu’on partage.

  3. #3
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    juillet 2016
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juillet 2016
    Messages : 2 613
    Points : 10 312
    Points
    10 312
    Billets dans le blog
    21
    Par défaut
    Je pense que l'auteur initial vient du monde javascript, où assigner this a une variable locale est courante, notamment avec les closures !

    En C# par contre, il n'y a aucun différence a appeler l'un ou l'autre. Introduire une variable supplémentaire qui contient this me parait même contreproductif !

    Par contre, le return this; a un intérêt, puisqu'il permet de chainer les méthodes : matrix.ClearScale().AddTranslation(...).AddRotation(...)...
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  4. #4
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    février 2010
    Messages
    4 019
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2010
    Messages : 4 019
    Points : 7 191
    Points
    7 191
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par François DORIN Voir le message
    Par contre, le return this; a un intérêt, puisqu'il permet de chainer les méthodes : matrix.ClearScale().AddTranslation(...).AddRotation(...)...
    Ah oui, c'est vrai, au temps pour moi

    Vu que je trouve cette syntaxe franchement pas jolie, je ne m'en sers jamais.
    On ne jouit bien que de ce qu’on partage.

  5. #5
    Expert éminent sénior

    Profil pro
    Développeur informatique
    Inscrit en
    novembre 2006
    Messages
    7 359
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : novembre 2006
    Messages : 7 359
    Points : 16 971
    Points
    16 971
    Par défaut
    bonsoir,
    il vaut mieux éviter d'utiliser une variable de type var et donc il faut la forcer à un type bien défini.
    Je sais qu'en Javascript on est contraint d'utiliser des "variants" mais en C# il vaut mieux utiliser un type plus correspondant.
    Parce que lorsqu'on définit une variable de type var le source compilé en Intermediate Language doit faire certainement beaucoup d'allocations.
    Pour une variable ce n'est pas important pour tout un tableau de variable ça peut nuire aux performances
    Qu'est ce qui est petit et marron ? Un marron ( Kaamelott)

  6. #6
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    novembre 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : novembre 2015
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    Merci à tous de vos commentaires et de vos remarques. Je continue...

  7. #7
    Membre émérite Avatar de meziantou
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    avril 2010
    Messages
    1 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : avril 2010
    Messages : 1 223
    Points : 2 424
    Points
    2 424
    Par défaut
    Le comportement entre les 2 syntaxes est différent si Matrix3d est une struct:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
        class Program
        {
            static void Main()
            {
                var sample = new Sample();
                sample.Value = 1;
                Console.WriteLine(sample.Value); // 1
     
                var sample1 = sample.Update();
                Console.WriteLine(sample.Value);  // 2
                Console.WriteLine(sample1.Value); // 2
     
                var sample2 = sample.Update2();
                Console.WriteLine(sample.Value);  // 2
                Console.WriteLine(sample2.Value); // 3
            }
        }
     
        struct Sample
        {
            public int Value { get; set; }
     
            public Sample Update()
            {
                Value = 2;
                return this;
            }
     
            public Sample Update2()
            {
                var a = this;
                a.Value = 3;
                return a;
            }
        }

Discussions similaires

  1. Problèmes de lecture/écriture sur deux sockets
    Par Popof dans le forum Linux
    Réponses: 2
    Dernier message: 27/11/2009, 00h14
  2. Comptez sur deux tables en même temps
    Par genova dans le forum Langage SQL
    Réponses: 12
    Dernier message: 13/09/2004, 19h58
  3. trigger sur deux tables
    Par Shabata dans le forum Développement
    Réponses: 4
    Dernier message: 04/05/2004, 17h55
  4. 2 Count() sur deux tables en jointures gauches
    Par Alexandre T dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/09/2003, 17h53
  5. Pb : malloc qui marche une fois sur deux .... ?
    Par guillaume_pfr dans le forum C
    Réponses: 14
    Dernier message: 21/07/2003, 10h52

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