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 :

Comment passer et récupérer des parametres ?


Sujet :

C#

  1. #1
    Membre émérite
    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
    Points : 2 498
    Points
    2 498
    Par défaut Comment passer et récupérer des parametres ?
    Bonjour

    Malgré ma longue expérience du C, j'ai encore quelques problèmes conceptuel a digerer certains passage de parametres en cSharp

    Je déclare une structure dans une classe
    J'y mets quelques info (filename etc)
    Je passe cette structure a une Form qui doit completer les infos

    Jusque la tout va bien mais je vois pas bien comment recuperer ma structure completée apres l'appel de la form

    Dans ma classe qui appelle la form
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
          ImportDef ImpDef = new ImportDef(); // structure d'info
     
          ImpDef.FileName = dlgFile.FileName;   // ajout de filename
          Form FrmImp = new FrmImportDef(ImpDef); // passage structure par constructeur
          FrmImp.ShowDialog();
    Ensuite pour l'utilisation dans la form
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      public partial class FrmImportDef : Form
      {
        ImportDef ImpDef;  // reference pour ma structure dans la form
        public FrmImportDef(ImportDef PRM_ImpDef)
        {
          ImpDef = PRM_ImpDef; // assignation de la structure a la reference
          InitializeComponent();
          Timp();
        }
    Je comprends que je ne passe pas un pointeur...
    Mais comment dois-je organiser le passage de parametre pour qu'a la fermeture de la form appelée je puisse recuperer les info modifiées dans ImpDef

  2. #2
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    459
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 459
    Points : 553
    Points
    553
    Par défaut
    Ajoute le mot-clef ref dans la signature (et de même sur l'appel) de la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public FrmImportDef(ref ImportDef PRM_ImpDef)

  3. #3
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Et pourquoi tu utilises une struct et pas une classe ?
    Les struct sont par défaut passées par valeur (donc copiées vers l'appelant, et la modifier ne modifie pas l'original). En utilisant une class tu n'a pas besoin du mot clef "ref" car elles sont toujours passée par référence (pointeur).
    De plus, question forme, une struct et une classe ça n'a que ça comme différence (en gros)...

  4. #4
    Membre émérite
    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
    Points : 2 498
    Points
    2 498
    Par défaut classe au lieu de structure
    Tu a sans doute raison

    J'utilise des structures par habitude du C

    Et j'avais aussi le sentiment que les classes en csharp c'etait chaque fois des fichiers différents !

  5. #5
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Tu peut organiser comme tu veux, c'est juste que une classe par fichier, en général on arrive à quelque chose de plus clair...
    En gros, tu peut toujours utiliser des class et à la limite oublier les struct, ça n'est vraiment utile que pour appeller des dlls natives ou si on veut passer un paramètre en interdisant justement de modifier l'original, mais là encore les structs ne sont pas toujours les mieux adaptées ...

  6. #6
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    587
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Octobre 2006
    Messages : 587
    Points : 706
    Points
    706
    Par défaut
    Bonsoir,

    Citation Envoyé par olibara Voir le message
    Et j'avais aussi le sentiment que les classes en csharp c'etait chaque fois des fichiers différents !
    Une classe = une structure = une interface = un fichier.

    Remarque: Les interfaces et structures peuvent aussi être partielles...

  7. #7
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Citation Envoyé par harz62 Voir le message
    Une classe = une structure = une interface = un fichier.
    Faux, ne dit pas de choses pareilles ...

    Une classe != une structure
    Les classes sont passée par référence, les structures sont passées par valeur

    Une classe != une interface
    Une interface c'est juste la définition d'un certain nombre de membres, de méthodes et d'évènements que vont implémenter une classe. Elles sont aussi passée par référence mais on ne peut pas les instancier, elles n'ont pas de constructeur, on ne peut pas y mettre de variables, etc ... Une interface peut hériter de plusieurs autres interfaces, une classe ne peut pas hériter de plusieurs classes. Par contre, elle peut implémenter plusieurs interfaces.

    Un classe != un fichier
    Tu peut mettre 30 classes dans un seul fichier le compilateur ne te dira rien. Tu peut aussi mettre 0 classes dans un fichier et il ne te parlera pas plus ...

  8. #8
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344

  9. #9
    Membre émérite
    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
    Points : 2 498
    Points
    2 498
    Par défaut Une classe par fichier ....
    Une classe par fichier ?

    Ca dépends..
    A mon avis pour des petites classes de regroupement de variables, c'est pas plus mal de les colectionner dans un meme fichier
    Dans le cas ci apres j'ai transformé ma structure ImpDef en classe
    et S_ImportInfo va suivre le meme chemin.
    Elles sont toutes les deux dans le fichier qui contient aussi la classe methode

    Il y a certainement a débattre sur cette manière, mais c'est simple clair et efficace
    Or je défends TOUJOURS la clarté et la simplicité AVANT methode theorique
    Mais les suggestions pertinentes sont toujours bienvenues.


    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
    namespace Mapscope.Import
    {
      public struct S_ImportInfo
      {
        public string filename;   // nom du fichier importe
        public uint nbRow;        // Nombre de row lus
        public uint nbDistinct;   // Nombre code reconnus distinct
        public uint nbFound;      // Nombre de row importés et code reconnu
        public uint nbNotFound;   // Nombre de row importés et code NON reconnu
        public uint nbEmpty;      // nombre d'entités non affectées
        public uint nbRowNul;     // nombre de row matchés avec valeurs nulles
        public uint nbNulResult;  // nombre d'entités reconues mais restées a zero
      }
     
      public class ImportDef
      {
        public int isValid;       // set to 1 if definition is valid
        public int ColCode;       // indice colonne code
        public int ColValue;      // indice colonne valeur
        public int HeaderRow;     // indice row header (NoHeader = -1)
        public int FirstDataRow;  // indice first data row (default = -1)
        public string Separators; // Separateurs
        public string FileName;   // full file name
      };
     
      public static class CImport
      {
      }

  10. #10
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Citation Envoyé par olibara Voir le message
    Une classe par fichier ?
    Non mais fait pas attention

  11. #11
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    587
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Octobre 2006
    Messages : 587
    Points : 706
    Points
    706
    Par défaut
    Bonsoir,

    Citation Envoyé par smyley Voir le message
    Faux, ne dit pas de choses pareilles ...

    Une classe != une structure
    Les classes sont passée par référence, les structures sont passées par valeur

    Une classe != une interface
    Une interface c'est juste la définition d'un certain nombre de membres, de méthodes et d'évènements que vont implémenter une classe. Elles sont aussi passée par référence mais on ne peut pas les instancier, elles n'ont pas de constructeur, on ne peut pas y mettre de variables, etc ... Une interface peut hériter de plusieurs autres interfaces, une classe ne peut pas hériter de plusieurs classes. Par contre, elle peut implémenter plusieurs interfaces.

    Un classe != un fichier
    Tu peut mettre 30 classes dans un seul fichier le compilateur ne te dira rien. Tu peut aussi mettre 0 classes dans un fichier et il ne te parlera pas plus ...
    Non tu n'as pas compris ce que je voulais dire -_-'. Je sais que tous ces membres. C'était juste pour dire que l'on place une interface dans un fichier, une classe dans un autre, une structure dans un autre ect...
    Je sais que l'on peut mettre plusieurs classes dans un fichier mais il vaut mieux le placer dans un fichier séparé pour bien organiser le code.

    Je connais la différence entre tous ces membres sont différents, je suis pas un débutant ^^. Comment as tu pu croire ça ^^

    Moi je dis une classe = 1 fichier (Par contre parle pas des classes partielles ^^). Je place seulement plusieurs classes/structures que lorsque je fais de l'interop...

    Remarque: Au sujet des interfaces tu as oublié de spécifier que tous les membres doivent être abstraits et dépourvu de modificateur d'accès.

  12. #12
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut


    Citation Envoyé par harz62 Voir le message
    Au sujet des interfaces tu as oublié de spécifier que tous les membres doivent être abstraits et dépourvu de modificateur d'accès.
    Sauf que le compilateur ne va pas te permettre d'adopter une autre démarche, c'est pas comme en C++ ou il faut tout dire soit même (dire que c'est pure virtual pour les interfaces ... ou un truc du genre)

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    J'ajoute à destination d'Olibara qu'il faut bien bien faire la distinction entre class et struct en C#. En C++, c'est exactement pareil. En C#, il faut voir que les structs se comportent comme les int, par exemple : ils sont copiés à chaque appel de fonction, à chaque affectation, etc.
    D'ailleurs, dans le modèle .Net, les types de base sont des struct

    Donc dans ton cas, où les objets que tu manipules ressemblent très fort à des records de BDD, qui passeront de main en main et seront modifiés partout, passe par des classes : c'est fait pour ça. Tu remarqueras que le framework utilise très peu les struct, à part pour des petits regroupements de types de base (Color = 3 int, Position = 2 int) dont les champs sont rarement modifiés unitairement.

    Bref : C# hérite de C++ qui a ajouté class au struct présents en C dont il hérite, mais le struct C# n'a rien à voir avec le struct C

  14. #14
    Membre émérite
    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
    Points : 2 498
    Points
    2 498
    Par défaut
    Yep !

    Merci Guul
    Oui effectivement, je dois adapter mes habitudes
    En C je déclarais des structure container dont je passais le pointeur partout ou il faut

    En C# je mettrai donc des classes avec peut etre en peu plus le besoin de declarer la classe publique car passer une classe d'info en parametre d'evénements c'est moins évident !

  15. #15
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Juste comme cela au passage, les structs en C# peuvent implémenter des méthodes comme les classes

    Les structures peuvent être utile.
    Par exemple, tu gères ton application avec les exceptions, et notemment des exceptions particulière que ton programme déclenche lors d'événement particulier.
    Pour chaque exception déclenchés tu va faire un fichier log avec un numéros d'erreur, sa description, etc...
    Bah tu peux utiliser une structure pour définir ce qu'est une erreur, et pour qu'elle contienne toute les données concernant l'erreur et une méthode de création de log.
    Ainsi on va dire que juste avant de déclencher l'exception tu remplies ta structure avec les info, et ta classe exception va appeler la méthode de création de log de l'erreur.
    Pkoi une struct et pas une classe statique dans ce cas là, parce que tu n'as pas besoin de conserver pendant toute la durée du prog les infos.
    Ta structure n'est créer que lorsque tu en as besoin, alors que la classe statique existera depuis le début comme un type.
    Et puis il y a l'histoire de pile et de tas. Si je ne me trompe pas la structure est crée dasn la pile de la mémoire d'accés plus rapide et de conservation plus faible que le tas. Enfin je ne suis pas sur de ne pas me tromper entre la pile et le tas, pour moi c notion date de 3 ans quand j'ai appris le c.

  16. #16
    Membre émérite
    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
    Points : 2 498
    Points
    2 498
    Par défaut
    Merci aussi Ced

    Effectivement c'est aussi un bon exemple ou l'usage d'une structure peut etre utile. Et ca devient aussi plus clair pour moi.

    N.B. En C une structure peut aussi contenir un pointeur de fonction donc plus ou moins une méthode mais OK, je sais c pas tout a fait la meme chose.

Discussions similaires

  1. Comment passer le sqlquery en parametres
    Par ceriise dans le forum Jasper
    Réponses: 1
    Dernier message: 15/11/2007, 15h29
  2. Réponses: 2
    Dernier message: 06/04/2007, 10h26
  3. Comment passer et lire des paramètres passé à mon application VB
    Par ssakhri dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 27/11/2006, 16h50
  4. Réponses: 4
    Dernier message: 20/04/2006, 11h07
  5. comment passer un iterateur en parametre
    Par mikebranque dans le forum C++
    Réponses: 1
    Dernier message: 18/03/2006, 12h03

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