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 :

Propriétés renvoyant des objets temporaires


Sujet :

C#

  1. #1
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut Propriétés renvoyant des objets temporaires
    Salut

    Je suis actuellement en train de développer le wrapper .Net d'une bibliothèque C (j'utilise du P/Invoke), et je suis face à un problème que je n'arrive pas à résoudre vu ma très faible expérience du C# ; je souhaiterais donc votre opinion.

    J'ai par exemple une classe Sprite avec une propriété Position de type Vector2.

    Voici le code C correspondant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    float Sprite_GetPositionX(Sprite* Instance);
    float Sprite_GetPositionY(Sprite* Instance);
    void  Sprite_SetPosition(Sprite* Instance, float X, float Y);
    Et ce que j'aimerais faire en C# :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Sprite
    {
        public Vector2 Position
        {
            get {return new Vector2(Sprite_GetPositionX(Instance), Sprite_GetPositionY(Instance));}
            set {Sprite_SetPosition(Instance, value.x, value.y);}
        }
     
        private IntPtr Instance;
    };
    Seulement, ce code inciterait à écrire des choses de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Sprite s = new Sprite;
    s.Position.x = 5;
    Ce qui n'est évidemment pas bon étant donné que s.Position ne renvoie qu'une instance temporaire, et que toute modification sur celle-ci n'aura aucun effet sur le sprite.

    Ma question est donc : que fait-on habituellement dans ce genre de situation en C# ? Faut-il que je remplace mes propriétés par des accesseurs ? Y a t-il une astuce pour éviter le problème cité ?

  2. #2
    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
    Salut,

    ça doit être l'un des cas où les structs sont utiles :
    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
    struct Vector
    {
    	public int X;
    	public int Y;
    	// + un constructeur mais j'ai la flemme :)
    }
    class A
    {
    	public Vector V { get { return new Vector(..., ...); } set { ... } }
    	void f()
    	{
    		this.V = new Vector(2, 4); // ok
    		this.V.X = 9; // exception !
    	}
    }
    ಠ_ಠ

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    En effet dans ce cas précis cela pourrait être utile, mais ça ne marche pas toujours. Par exemple, j'ai également des propriétés qui renvoient des variables de type string.

  4. #4
    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
    Citation Envoyé par Laurent Gomila Voir le message
    En effet dans ce cas précis cela pourrait être utile, mais ça ne marche pas toujours. Par exemple, j'ai également des propriétés qui renvoient des variables de type string.
    Et ? je vois pas le problème, là
    ಠ_ಠ

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Et bien si je modifie la chaîne renvoyée cela n'aura aucun effet sur mon objet.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Sprite s = new Sprite;
    s.Name.replace(...); // aucun effet

  6. #6
    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
    Citation Envoyé par Laurent Gomila Voir le message
    Et bien si je modifie la chaîne renvoyée cela n'aura aucun effet sur mon objet.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Sprite s = new Sprite;
    s.Name.replace(...); // aucun effet
    Ça n'en aurait pas eu plus si Name avait été une propriété standard, car les string sont immutable en C#. string.Replace renvoie une nouvelle chaîne, et ne modifie pas l'instance sur laquelle elle a été appelée.
    ಠ_ಠ

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ah d'accord, désolé je ne le savais pas

    Comme je l'ai dit, je n'ai quasiment jamais pratiqué le C#.

Discussions similaires

  1. [PHP 5.0] [POO] Propriétés comme des objets dans une classe
    Par Zaki_SDwin dans le forum Langage
    Réponses: 8
    Dernier message: 30/06/2010, 12h54
  2. Réponses: 3
    Dernier message: 15/12/2006, 18h52
  3. Réponses: 4
    Dernier message: 23/10/2006, 15h20
  4. [VB6] Modification des propriétés d'un objet de form dans un module
    Par Lucas42 dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 09/06/2006, 09h46
  5. Grouper des objets partageant des propriétés
    Par camboui dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 06/04/2006, 19h01

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