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

Tanguy0169 Messages postés 2 Date d'inscription vendredi 12 avril 2019 Statut Membre Dernière intervention 17 avril 2019 - Modifié le 19 avril 2019 à 11:50
Whismeril Messages postés 19039 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 7 mai 2024 - 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 :
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.

4 réponses

NHenry Messages postés 15114 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 4 mai 2024 159
12 avril 2019 à 18:16
Les objets sont passés par référence.
Si tu ne veux pas modifier un objet, il faut le cloner.
0
Whismeril Messages postés 19039 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 7 mai 2024 656
12 avril 2019 à 18:26
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;


0
Tanguy0169 Messages postés 2 Date d'inscription vendredi 12 avril 2019 Statut Membre Dernière intervention 17 avril 2019
17 avril 2019 à 16:12
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
0
Whismeril Messages postés 19039 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 7 mai 2024 656
17 avril 2019 à 17:20
Bonsoir ref sert à passer des types valeurs par référence.
0
Rejoignez-nous