[C#] Copie ou référence d'objets [Fermé]

Signaler
Messages postés
245
Date d'inscription
mercredi 28 septembre 2005
Statut
Membre
Dernière intervention
12 septembre 2007
-
Messages postés
33478
Date d'inscription
jeudi 14 octobre 2004
Statut
Modérateur
Dernière intervention
24 février 2011
-
Salut,

Ca fais quelques temps que j'ai débuté dans C#, et j'ai une tite questions sans doute ridicule, mais pas sans importance :

J'ai fais une classe qui regroupe une liste de propriétés, une connexion à une bdd et quelques process de mise en forme de mes propriétés... jusque la pas de pb.

Cette class est en quelque sorte les propriétés d'un doc et je l'utilise partout... et la est le pb, dans mes constructeurs d'autres class, je passe en paramètre celle ci pour remplir un champ privé du meme type et je voulais savoir si je fesais une copie des données et des objets ou si je fesais une référence... parce que certaines de mes classes utilisent en cascade celle ci et je n'est pas envi de cumuler les copies.

Merci

11 réponses

Messages postés
140
Date d'inscription
dimanche 15 avril 2007
Statut
Membre
Dernière intervention
2 novembre 2009
19
Non non c'est bon.

Donc le C# a bien une lacune : on ne peut pas copier directement un objet...


En c#, obj1 = obj2; revient à faire obj1 = & obj2; en C++...
En C++ tu peux copien directement l'objet si tu fais obj1 = obj2;

Donc merci beaucoup :o)
13
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 63550 internautes nous ont dit merci ce mois-ci

Messages postés
33478
Date d'inscription
jeudi 14 octobre 2004
Statut
Modérateur
Dernière intervention
24 février 2011
1 755
Compris :o)

Prévois une fonction "Clone" dans ta classe, comme ça tu dis "obj2 = obj1.Clone()" et ton problème est résolu (dans les sous classes il faut que la fonction clone soit implémentée, les sous classes ayant un constructeur)
Ou alors j'ai loupé un épisode?
Messages postés
33478
Date d'inscription
jeudi 14 octobre 2004
Statut
Modérateur
Dernière intervention
24 février 2011
1 755
Bonjour,

Si c'est une classe, et non une structure, si tu ne précises pas, ça sera une réference.

Néamoins, dans ton cas je définirai tout en static dans cette classe, et je ne la passerai pas en paramètre des constructeurs mais j'utiliserai directement la classe

Voir à ce sujet:

https://www.dofactory.com/net/singleton-design-pattern
Messages postés
245
Date d'inscription
mercredi 28 septembre 2005
Statut
Membre
Dernière intervention
12 septembre 2007
123
tiens voila une partie du code de ma class :

    public class optExplorer
    {
        /// <param name="strUrl">URL du domaine</param>
        /// <param name="strPath">Chemin de la base de données</param>
        public optExplorer(string strUrl, string strPath) 
        {
            this.strUrl = strUrl;
            this.strPath = strPath;
            oleDBCnc = new OleDbConnection();
            oleDBCnc.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\"" + strPath + "\";Persist Security Info=True";
            oleDBCnc.Open();
        }


        #region Option

        private string strUrl;
        private string strPath;
        private OleDbConnection oleDBCnc;

        /// <summary>
        /// Obtient ou défini l'URL du domaine
        /// </summary>
        public string UrlDomaine
        {
            get { return this.strUrl; }
            set { this.strUrl = value; }
        }
        /// <summary>
        /// Obtient ou défini le chemin des données de stockage
        /// </summary>
        public string cheminData
        {
            get { return this.strPath; }
            set { this.strPath = value; }
        }
        /// <summary>
        /// Obtient la connexion à la base de données
        /// </summary>
        public OleDbConnection cnc
        {
            get { return this.oleDBCnc; }
        }

        #endregion
}


et donc je l'utilise comme ceci après :

        #region Variables
        private optExplorer optionEploration;
        #endregion

        #region Constructeur
        public urlExplorer(optExplorer optionEploration)
        {
            this.optionEploration = optionEploration;
        }
        #endregion
Messages postés
33478
Date d'inscription
jeudi 14 octobre 2004
Statut
Modérateur
Dernière intervention
24 février 2011
1 755
Oui et?
Messages postés
245
Date d'inscription
mercredi 28 septembre 2005
Statut
Membre
Dernière intervention
12 septembre 2007
123
ben je voulais savoir si je fesais une référence ou une copie avec ca :
        private optExplorer optionEploration;

        public urlExplorer(optExplorer optionEploration)
        {
            this.optionEploration = optionEploration;
        }
Messages postés
33478
Date d'inscription
jeudi 14 octobre 2004
Statut
Modérateur
Dernière intervention
24 février 2011
1 755
Une référence, mais tu devrais regarder le principe du singleton dans ton cas.
Messages postés
140
Date d'inscription
dimanche 15 avril 2007
Statut
Membre
Dernière intervention
2 novembre 2009
19
Salut

J'ai besoin de copier une classe dans mon cas. Et le singleton ne m'aide pas...
Je dois envoyer un objet en paramètre mais je veux qu'il se copie et non s'envoie par référence...

Comment fait-on ?

Merci
Messages postés
33478
Date d'inscription
jeudi 14 octobre 2004
Statut
Modérateur
Dernière intervention
24 février 2011
1 755
Salut, tu veux copier ta classe ou une de ses instances?
Si c'est une instance, tu peux implémenter une fonction "clone" par exemple...
Messages postés
140
Date d'inscription
dimanche 15 avril 2007
Statut
Membre
Dernière intervention
2 novembre 2009
19
Yop

Ben en fait il doit bien avoir moyer de faire genre :

MaClass obj1 = new MaClass();
Maclass obj2 = obj1;

obj1.Prop1 = "CR";
obj2.Prop1 = "23";

MessageBox.Show( obj1.Prop1 + obj2.Prop1 ); // CR23



Comme si c'était des string



Mici
Messages postés
33478
Date d'inscription
jeudi 14 octobre 2004
Statut
Modérateur
Dernière intervention
24 février 2011
1 755
Quel est l'intérêt de dire qu'ils sont égaux (assigné l'un à l'autre) si c'est pour ne pas avoir la même valeur?
Messages postés
140
Date d'inscription
dimanche 15 avril 2007
Statut
Membre
Dernière intervention
2 novembre 2009
19
J'aurais du mal à t'expliquer, mais en gros j'aimerai mettre des objets d'une classe abstract dans un tableau mais comme c'est une classe abstract, je peux pas faire new ClasseDeBase() afin de remplir mon tableau...

je te mets une illustration rapide :


public abstract class ClasseDeBase
{
    public static List<ClasseDeBase> GetAll()
    {
        List<ClasseDeBase> tmpList = new List<ClasseDeBase>();
        List<string> tmpOldList = blabla(); // par un savant code je liste des objets
        
        ClasseDeBase tmpObj = new ClasseDeBase(); // ça c'est impossible alors j'ai feinté (voir code à la suite)

        tmpObj.Prop1 = tmpOldList;

        tmpList.Add( tmpObj );
        return tmpList;
    }
}


Comme on peut pas instancier une classe abstract, j'ai fait comme ceci



public abstract class ClasseDeBase
{
    public static List<ClasseDeBase> GetAll(ClasseDeBase newClass)
    {
        List<ClasseDeBase> tmpList = new List<ClasseDeBase>();
        List<string> tmpOldList = blabla(); // par un savant code je liste des objets
        
        ClasseDeBase tmpObj = newClass; // c'est ici que j'aimerai copier, pour "simuler" un NEW

        tmpObj.Prop1 = tmpOldList;

        tmpList.Add( tmpObj );
        return tmpList;
    }
}

public class Class2 : ClasseDeBase
{

    public static List<Class2> GetAllClass2()
    {
         List<ClasseDeBase> tmpList = GetAll( (ClasseDeBase) new Class2() ); // je fais un cast pour lui envoyer un new ClasseDeBase
    
        List<Class2> tmpListClass2 = new List<Class2>();


        foreach(ClasseDeBase iBase in tmpList) // on convertit le tableau de  List<ClasseDeBase> à List<Class2>
        {
            tmpListClass2 .Add( (Class2)iBase );
        }
    }
}

C'est compréhendable ?

Mais s'il y a un meilleur moyen, je ne le connais pas...
Messages postés
33478
Date d'inscription
jeudi 14 octobre 2004
Statut
Modérateur
Dernière intervention
24 février 2011
1 755
Ceci il me semble qu'il y a un moyen (déconseillé) mais je ne le retrouve plus :-S