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 :

équivalent de WITH (Delphi) existe-t-il en C# ?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 6
    Par défaut équivalent de WITH (Delphi) existe-t-il en C# ?
    Bonjour,

    Je débute en C# et je cherche désespérement un équivalent à l'instruction "WITH" du langage pascal object de Delphi. Pour les portions de code ou l'on fait des traitements qui portent principalement sur un objet dont le nom est long, cette instruction permet d'alléger le code et d'en faciliter la lecture.

    D'avance merci

    Bob

  2. #2
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Hello,

    ça existe en VB.Net, mais pas en C#.

    Je sais que c'est un sujet de troll entre VBistes (et Delphistes, visblement ) et les C#istes, mais perso j'ai jamais compris à quoi ça servait : j'ai jamais eu dans mon code à appeler plusieurs fois des méthodes / champs d'un même objet dont le nom serait trop long. Le mot clé foreach, entre autres, limite ce besoin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    for (int i = 0 ; i < biduleAvecunNomCompliquéDeLaMort.Length ; i++)
    {
      biduleAvecunNomCompliquéDeLaMort[i].Truc = Oualala(biduleAvecunNomCompliquéDeLaMort[i].Machin);
      biduleAvecunNomCompliquéDeLaMort[i].Chose = Choubidou(bidou);
     ...
    }
     
    //versus
    foreach(Truc t in biduleAvecunNomCompliquéDeLaMort)
    {
      t.Truc = Oualala(t.Machin);
      t.Chose = Choubidou(bidou);
     ...
    }

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 6
    Par défaut
    Merci Guulh pour cette réponse.
    Concernant le foreach, c'est très bien pour énumérer les éléments d'un tableau ou d'une collection.
    dan mon cas, je n'ai qu'un seul objet à énumérer ...
    Du peux développer le "entre autre" stp ;-)

    Je regarde comment on tag du code sur le forum, et je poste un message avec un exemple.

    a+

    Bob

  4. #4
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 6
    Par défaut
    Exemple de code pour lequel je souhaite utiliser WITH :
    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
     
                if ((Proxy_Machine_List[current_Proxy_Machine].Schedules.Next_Time - DateTime.Now) <= TimeSpan.Parse("00:00:00"))
                {
                    /* Chargement des données depuis l'automate programmable */
                    if (Proxy_Machine_List[current_Proxy_Machine].Load_Values_From_PLC())
                    {
                        Proxy_Machine_List[current_Proxy_Machine].Attempt_Count = 0;
                        Proxy_Machine_List[current_Proxy_Machine].Schedules.Next_Time = Proxy_Machine_List[current_Proxy_Machine].Schedules.Next_Time.Add(TimeSpan.Parse(Proxy_Machine_List[current_Proxy_Machine].Schedules.Period));
     
                        Proxy_Machine_List[current_Proxy_Machine].Analyse_Events_History();
     
                        /* Le nom du fichier cible est construit de la façon suivante : Client/Id */
                        string fileName;
                        if (Proxy_Machine_List[current_Proxy_Machine].Customer != "")
                            fileName = Production_Path + Proxy_Machine_List[current_Proxy_Machine].Customer + "\\" + Proxy_Machine_List[current_Proxy_Machine].Id + "_" + DateTime.Now.ToString("yyyyMMdd_HHmm");
                        else
                            fileName = Production_Path + Proxy_Machine_List[current_Proxy_Machine].Id + "_" + DateTime.Now.ToString("yyyyMMdd_HHmm");
     
                        SerializationService.Save(fileName + "." + Production_Extension, Proxy_Machine_List[current_Proxy_Machine]);
                        ODFToolBox.Transform(fileName + "." + Production_Extension, AppDomain.CurrentDomain.BaseDirectory + "Fusion_machine_Production_avec_graphique.ods", fileName + ".ods");
                    }
                    else
                    {
                        Proxy_Machine_List[current_Proxy_Machine].Attempt_Count = Proxy_Machine_List[current_Proxy_Machine].Attempt_Count + 1;
                        if (Proxy_Machine_List[current_Proxy_Machine].Attempt_Count == 1)
                            Proxy_Machine_List[current_Proxy_Machine].Schedules.Next_Time = Proxy_Machine_List[current_Proxy_Machine].Schedules.Next_Time.Add(TimeSpan.Parse(Proxy_Machine_List[current_Proxy_Machine].Schedules.Second_Attempt));
                        else
                            Proxy_Machine_List[current_Proxy_Machine].Schedules.Next_Time = Proxy_Machine_List[current_Proxy_Machine].Schedules.Next_Time.Add(TimeSpan.Parse(Proxy_Machine_List[current_Proxy_Machine].Schedules.Next_Attempts));
                    }
                }
                this.Busy = false;
    Qui deviendrait si je trouve une solution équivalente à WITH :

    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
     
    with (Proxy_Machine_List[current_Proxy_Machine])
    {
                if (Schedules.Next_Time - DateTime.Now) <= TimeSpan.Parse("00:00:00"))
                {
                    /* Chargement des données depuis l'automate programmable */
                    if (Load_Values_From_PLC())
                    {
                        Attempt_Count = 0;
                        Schedules.Next_Time = Schedules.Next_Time.Add(TimeSpan.Parse(Schedules.Period));
     
                        Analyse_Events_History();
     
                        /* Le nom du fichier cible est construit de la façon suivante : Client/Id */
                        string fileName;
                        if (Customer != "")
                            fileName = Production_Path + Customer + "\\" + Id + "_" + DateTime.Now.ToString("yyyyMMdd_HHmm");
                        else
                            fileName = Production_Path + Id + "_" + DateTime.Now.ToString("yyyyMMdd_HHmm");
     
                        SerializationService.Save(fileName + "." + Production_Extension, Proxy_Machine_List[current_Proxy_Machine]);
                        ODFToolBox.Transform(fileName + "." + Production_Extension, AppDomain.CurrentDomain.BaseDirectory + "Fusion_machine_Production_avec_graphique.ods", fileName + ".ods");
                    }
                    else
                    {
                        Attempt_Count = Attempt_Count + 1;
                        if (Attempt_Count == 1)
                            Schedules.Next_Time = Schedules.Next_Time.Add(TimeSpan.Parse(Schedules.Second_Attempt));
                        else
                            Schedules.Next_Time = Schedules.Next_Time.Add(TimeSpan.Parse(Schedules.Next_Attempts));
                    }
                }
                this.Busy = false;
    Tu vois mieux l'intérêt de cette instruction WITH ;-)

  5. #5
    Membre Expert Avatar de Arthis
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Italie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 265
    Par défaut
    Pourquoi ne pas faire simplement :
    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
     
    MonSchedule MonInstance;
     
    MonInstance =  Proxy_Machine_List[current_Proxy_Machine].Schedules;
     
     if (MonInstance.Next_Time - DateTime.Now) <= TimeSpan.Parse("00:00:00"))
                {
                    /* Chargement des données depuis l'automate programmable */
                    if (Load_Values_From_PLC())
                    {
                        Attempt_Count = 0;
                        MonInstance .Next_Time = MonInstance.Next_Time.Add(TimeSpan.Parse(Schedules.Period));
     
    etc...
    }

  6. #6
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 6
    Par défaut
    Merci Arthis, effectivement, ç'est une solution que j'ai envisagée, si le WITH n'existe vraiment pas.
    ça ne risque pas de perturber le garbage-collector, ce genre d'affectation ?

  7. #7
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Citation Envoyé par Bobiciel Voir le message
    Tu vois mieux l'intérêt de cette instruction WITH ;-)
    Non, parce que ça inciterait à faire des fonctions immondes de centaines de lignes avec des if de partout et des for par milliers... Je préfère largement ici créer une sous-méthode qui prend un objet ProxyMachine en paramètre (à supposer que Proxy_Machine_List soit une collection de ProxyMachine), même si elle est à usage unique.

  8. #8
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 6
    Par défaut
    Citation Envoyé par Guulh Voir le message
    Non, parce que ça inciterait à faire des fonctions immondes de centaines de lignes avec des if de partout et des for par milliers... Je préfère largement ici créer une sous-méthode qui prend un objet ProxyMachine en paramètre (à supposer que Proxy_Machine_List soit une collection de ProxyMachine), même si elle est à usage unique.
    Effectivement, je suis d'accord avec toi, il vaut mieux scinder le code en fonctions plus petites et plus spécialisées, mais dans mon cas, il ne s'agit que de 3 if imbriqués c'est raisonnable, non ?

    Ceci dit, je retiens également ta solution.

    en attendant que le WITH soit implémenté dans une future version de C#

    Bonne soirée

    Bob

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

Discussions similaires

  1. send mail with delphi
    Par momedalhouma dans le forum Langage
    Réponses: 6
    Dernier message: 12/02/2012, 12h47
  2. Équivalent du "with" de delphi en C#
    Par jimbolelephan dans le forum C#
    Réponses: 4
    Dernier message: 29/06/2008, 10h26
  3. Réponses: 3
    Dernier message: 30/01/2006, 15h57

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