Rechercher : dans
Par :

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

Dernière réponse le 30 sep 2008 à 11:35:08 Lust, le 5 oct 2006 à 11:46:12 
 Signaler ce message aux modérateurs

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

Configuration: XP Pro sur Dell Dimension
Serveur IIS, Tomcat, PHP, MySQL et SQL Serveur Express

Meilleures réponses pour « [C#] Copie ou référence d'objets » dans :
Sims 3 - Codes de triche VoirEn cours de partie, appuyez sur CTRL + Maj + C pour ouvrir la console, puis saisissez les codes suivants. constrainFloorElevation [false] Ce code vous permet de soulever ou d'abaisser le sol, même lorsqu'il y a des objets et des murs...
Problème de copier-coller sous Firefox VoirDe temps en temps, Firefox refuse de copier ou de coller du contenu ? Adware Pushow Il s'agit probablement d'un adware, appelé pushow**.dll (pushow35.dll, pushow42.dll, etc.) localisé dans c:\windows\system32. Si vous trouvez un tel fichier,...
[Webmaster] Empêcher la copie de mes images (et autres) VoirA tous ceux qui veulent empêcher la copie de leurs images, leurs créations, leurs vidéos, leurs articles, etc... Je veux empêcher les autres de copier mes images et mes pages HTML. Comment faire ? Réponse: C'EST IMPOSSIBLE Il n'existe aucun...
Les objets en langage C++ VoirLa création d'objets En C++, il existe deux façons de créer des objets, c'est-à-dire d'instancier une classe : de façon statique de façon dynamique La création statique La création statique d'objets consiste à créer un objet en lui affectant un...
Langage C++ - Les pointeurs VoirComme en langage C, le langage C++ permet d'utiliser des pointeurs pour manipuler des données, mais il introduit aussi le concept de référence, très pratique pour permettre la modification d'une donnée passée en paramètre d'une fonction. Définition...
Les chaînes de caractères en C++ VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C++, une...

1

teebo, le 5 oct 2006 à 11:52:51

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:

http://www.dofactory.com/Patterns/PatternSingleton.aspx
Goutez l'amer ... Buvez le vinaigre

Répondre à teebo

2

Lust, le 5 oct 2006 à 12:07:10

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

Répondre à Lust

3

teebo, le 5 oct 2006 à 12:12:11

Oui et?
Goutez l'amer ... Buvez le vinaigre

Répondre à teebo

4

Lust, le 5 oct 2006 à 12:16:06

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;
        }

Répondre à Lust

5

teebo, le 5 oct 2006 à 12:22:27

Une référence, mais tu devrais regarder le principe du singleton dans ton cas.
Goutez l'amer ... Buvez le vinaigre

Répondre à teebo

6

56ka, le 30 sep 2008 à 09:54:45

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

Répondre à 56ka

7

teebo, le 30 sep 2008 à 10:20:02

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...
Ramenez-nous Bobo sur les onglets et pendez les ergonomes avec leur point d'interrogation!
À bas le point d'interrogation sanglant!

Répondre à teebo

8

56ka, le 30 sep 2008 à 10:26: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

Répondre à 56ka

9

teebo, le 30 sep 2008 à 10:46:46

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?
Ramenez-nous Bobo sur les onglets et pendez les ergonomes av­ec leur point d'interrogation!
À bas le point d'interrogation sanglant!

Répondre à teebo

10

56ka, le 30 sep 2008 à 11:04: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...

Répondre à 56ka

11

teebo, le 30 sep 2008 à 11:15:44

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?
Ramenez-nous Bobo sur les onglets et pendez les ergonomes avec leur point d'interrogation!
À bas le point d'interrogation sanglant!

Répondre à teebo

12

56ka, le 30 sep 2008 à 11:28:15

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)

Répondre à 56ka

13

 teebo, le 30 sep 2008 à 11:35:08

Ceci il me semble qu'il y a un moyen (déconseillé) mais je ne le retrouve plus :-S
Ramenez-nous Bobo sur les onglets et pendez les ergonomes av­ec leur point d'interrogation!
À bas le point d'interrogation sanglant!

Répondre à teebo