Objet passé en argument d'un constructeur modifié à tord
Tanguy0169
Messages postés2Date d'inscriptionvendredi 12 avril 2019StatutMembreDernière intervention17 avril 2019
-
Modifié le 19 avril 2019 à 11:50
Whismeril
Messages postés18796Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention 2 décembre 2023
-
17 avril 2019 à 17:20
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 :
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.
A voir également:
Objet passé en argument d'un constructeur modifié à tord
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
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;