Objet passé en argument d'un constructeur modifié à tord

Messages postés
2
Date d'inscription
vendredi 12 avril 2019
Statut
Membre
Dernière intervention
17 avril 2019
-
Bonjour,

J'ai une form principale nommé "MainFrm" ( "public partial class MainFrm : Form" ), je déclare un datatable "DataTable datatable_res_prod;" ce dernier est alimenté avec le résultat d'une requete. Jusque là tout est OK.

Depuis ma form principale, j'ouvre une autre form via la ligne suivante : "ProjectFrm modifyProject = new ProjectFrm(conn, _row_projet, datatable_res_prod, datatable_produitdef);"

Avec en argument le DataTable datatable_res_prod entre autre.

Dans le constructeur de la nouvelle forme, il y a :
public ProjectFrm(OracleConnection _conn, DataRow _row_projet_, DataTable _datatable_resp_prj_, DataTable _datatable_produitdef_)
{
    InitializeComponent();

    conn = _conn;

    _row_projet = _row_projet_;

    _datatable_resp_prj = _datatable_resp_prj_;
    _datatable_produitdef = _datatable_produitdef_;

    Alimentation_liste_resp_prj();
}


Je récupère donc le contenu du DataTable datatable_res_prod dans le DataTable _datatable_resp_prj et ce dernier est modifié (en fait j'ajoute une rangée en position 0) dans "Alimentation_liste_resp_prj()"

Lorsque je quitte cette form et que je reviens dans la form principale, alors le DataTable datatable_res_prod a lui aussi la nouvelle rangée. Et là je ne comprends pas pourquoi.
Afficher la suite 

4 réponses

Messages postés
14599
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
8 décembre 2019
137
0
Merci
Les objets sont passés par référence.
Si tu ne veux pas modifier un objet, il faut le cloner.
Commenter la réponse de NHenry
Messages postés
14030
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
8 décembre 2019
322
0
Merci
Bonjour

à l'avenir, merci d'utiliser la coloration syntaxique quand tu postes un code, voir ici https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

En plus tu ne respectes pas les conventions de nommage, ce qui rend ton code encore plus difficile à décrypter. https://docs.microsoft.com/fr-fr/dotnet/csharp/programming-guide/inside-a-program/coding-conventions

Pour ta question, à proprement dit, je n'ai pas lu ton code, mais tes explications sont largement suffisantes.

Ça n'est pas modifié à tord, c'est une des bases de C#.

En gros, quand on crée une variable, on utilise 2 zones de la mémoire:
  • une zone où est stockée la donnée
  • une zone qui permet de faire le lien entre le texte de ton code (le nom de la variable) et la zone précédente -> c'est la référence.


string monTexte;//ici j'ai créé une référence qui lie mon texte à une future zone de mémoire contenant une string
monTexte = "Bonjour";//ici j'ai routé ma référence vers une zone de mémoire qui contient "Bonjour";

//PS c'est mieux en couleur non?


Il existe 2 types de variables en C#, les types "Valeurs" et les types "Références".

Avec les types "Valeurs", quand on transmet la donnée (en paramètre par exemple), on transmet la valeurs, on crée donc 2 nouvelles zones de mémoire, une nouvelle référence et une nouvelle valeur;
int un = 1;
int unBis = un;//ici je crée une nouvelle référence, et je copie la valeur dans une nouvelle valeur
unBis++;
//ici 'un' vaut 1, et 'unBis' vaut 2

Les types "valeur", sont les énumérations et les structures, tous les types numéraux basique sont des structures, bool aussi
https://docs.microsoft.com/fr-fr/dotnet/csharp/language-reference/keywords/value-types

Tous les autres types, sont des types "Référence".
Quand on transmet un type référence, on ne copie pas la valeur, on crée une nouvelle référence vers la valeur initiale. Donc les 2 variables partagent la valeur.

Par exemple, soit une classe Prix, qui possède une propriété HT (hors taxe), et ce code
            Prix prix = new Prix { HT = 100 };
            Prix prix2 = prix;
            prix2.HT = 120;


Commenter la réponse de Whismeril
Messages postés
2
Date d'inscription
vendredi 12 avril 2019
Statut
Membre
Dernière intervention
17 avril 2019
0
Merci
Bonjour et merci pour vos réponses.

C'était mon 1ier post, je ferai attention la prochaine fois à la coloration syntaxique.

Je pensais qu'il fallait mettre le mot clé ref pour passer un objet en référence et non que c'était implicite.

Cordialement
Commenter la réponse de Tanguy0169
Messages postés
14030
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
8 décembre 2019
322
0
Merci
Bonsoir ref sert à passer des types valeurs par référence.
Commenter la réponse de Whismeril