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 :

accesseur readonly pas tout a fait readonly


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 612
    Par défaut accesseur readonly pas tout a fait readonly
    bonjour

    je possede une classe principal (GameManager) qui me permet de gerer d'une maniere bien presice des objets de type divers, ce gestionnaire utilise des Dictionnary

    exemple de dictionnaire utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private Dictionary<string, Menu> menus;
    public Dictionary<string, Menu> Menus
    {
        get { return menus; }
        private set { menus = value; }
    }

    dans une de mes classe(par exemple Menu) j'arrive a utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GameManager.GetInstance().Menus.Remove("menu1");

    j'arrive donc a ajouter/supprimer du contenu malgres le ReadOnly


    j'aimerais donc avoir la possibilitè d'acceder au objets contenus par les Dictionnary(voir de modifier les objets en question) mais surtout pas d'en ajouter/supprimer

    pour en ajouter/supprimer il faudrais passer par les fonctions prevus a cet effet (fonction inclus dans la classe du gestionnaire)


    merci

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    tu peux faire une classe qui hérite du dictionary et ne pas mettre les membres add et remove en public
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Propriété en lecture seule signifie que tu ne peux affecter de valeur à la propriété. Cela ne veut pas dire que l'objet est en lecture seule.

    Tu ne peux donc pas faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monObjet.MaPropriete = valeur;
    Mais rien n'empêche de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monObjet.MaPropriete.Clear();
    Pour ton problème tu peux, par exemple, renvoyer un copie en profondeur du dictionnaire (cf. méthode Clone, interface ICloneable). Résultat, même si l'utilisateur modifie le dictionnaire que tu lui renvoies, ton dictionnaire interne ne sera pas modifié.

    A ce moment, plutôt que d'utiliser une propriété il vaut mieux utiliser une méthode pour obtenir ce dictionnaire. Une propriété est supposée être "rapide" d'accès, si le traitement est plus lourd il vaut mieux mettre une méthode (cf. ce lien pour un exemple similaire).

    Sinon il faut comme l'indique Pol63 que tu fasses un wrapper autour du dictionnaire pour empêcher les modifications directes. Un peu comme les ReadOnlyCollection<T> de .Net.

    Seul problème éventuellement, il sera toujours possible d'accéder aux valeurs et de les modifier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monDico[key].MaPropriete = valeur;
    Si tu ne veux pas que ce soit possible, passe par une copie en profondeur. Ainsi même si l'utilisateur modifie l'élément, ta copie interne sera préservée.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 612
    Par défaut
    le renvoi d'une copie ne me tente pas trop...

    asser lourd (surtout vu ce qu'il y a derriere) et j'avais esperet avoir une interaction avec le compilateur

    il est impossible de fair cela car la propriete est en lecture seule

    merci pour les reponses explication
    je pense que je vais laisser en lecture seul avec documentation.
    comme tout tourne autour de la classe GameManager (est quelle ne possede qu'une dizaine de fonction) je pense que tout bon utilisateur liras leur nom avans..

  5. #5
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    le renvoi d'une copie ne me tente pas trop ... assez lourd (surtout vu ce qu'il y a derriere)
    C'est toi qui voit. Mais si jamais par "assez lourd" tu sous-entends que le graphe d'objets à cloner est complexe, il y a une alternative en utilisant la sérialisation binaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    MonType clone = null;
    using (MemoryStream ms = new MemoryStream())
    {
        BinaryFormatter f = new BinaryFormatter();
        f.Serialize(ms, monObjet);
        ms.Position = 0;
        clone = (MonType)f.Deserialize(ms);
    }
    return clone;
    Seule nécessité, marquer les classes du graphe d'objets avec l'attribut Serializable.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 612
    Par défaut
    non du tout, c'est plutot que tout mes objet s'integre dans des projet XNA et derive de classe interne au framework plus d'autre personnel et contient une grande quantite d'info

    si on ajoute le fait que (sauf au lancement) chaque traitemen lourd feras chuter le FPS je prefere eviter et mettre une consigne "utiliser tels fonctions ; ne surtout pas fair ceci"

  7. #7
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380

Discussions similaires

  1. Réponses: 0
    Dernier message: 14/12/2010, 17h12
  2. history.go et IE qui marche.. mais pas tout à fait !
    Par sacha69 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 19/09/2008, 11h54
  3. [AJAX] Open() qui ne se fait pas tout le temps sous IE ?
    Par Loïs Estienne dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 07/05/2008, 11h45
  4. extraire des données d'un doc pas tout a fait xml
    Par chrix10.2 dans le forum Général Python
    Réponses: 1
    Dernier message: 21/12/2006, 18h59
  5. La 2D isométrique pas tout à fait isométrique
    Par usbeck dans le forum Développement 2D, 3D et Jeux
    Réponses: 3
    Dernier message: 16/07/2006, 13h43

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