using System;

namespace Exemple_valeur_reference
{
    struct TypeValExemple 
    {
        public int code_Apoge;
        public string nomEtudiant;
    }

    class TypeRefExemple
    {
        public float note;
        public string nomEtudiant;
    }

    class Program
    {  
        static void Main()
        {
            string nom_1="Dupont"; //type référence
            float note=13.5f; //type valeur
            int code=12321;  //type valeur
            string nom_2;  //type référence
            // creation de deux variables du type TypeValExemple
            TypeValExemple varTypeVal1; // forme 1
            TypeValExemple varTypeVal2=new TypeValExemple();// forme 2
        
            TypeRefExemple varTypeRef1;// référence non initialisée
            TypeRefExemple varTypeRef2=new TypeRefExemple(); // fait référence au  nouvel objet crée par l'opréarateur new

            //la ligne suivante ne compile pas:varTypeVal1 est un objet non initialisé!!!
            //Console.WriteLine("Etud1 :"+varTypeVal1.code_Apoge+"::"+varTypeVal1.nomEtudiant);

            varTypeVal2.code_Apoge = code;
            varTypeVal2.nomEtudiant = nom_1;
            varTypeVal1=varTypeVal2; //2 objets séparés: copie en valeur champ par champ
            Console.WriteLine("Etud1 :"+varTypeVal1.code_Apoge+"//"+varTypeVal1.nomEtudiant);
            Console.WriteLine("Etud2 :" + varTypeVal2.code_Apoge + "//" + varTypeVal2.nomEtudiant);
            nom_2 = nom_1;
            // ne pas confondre la variable note avec le champs note de l'objet Etudiant4_TypeRef de type TypeRefExemple
            varTypeRef2.note = note;
            varTypeRef2.nomEtudiant = nom_2;

            // la ligne suivante ne compile pas:TypeRefExemple n'est pas un objet( ie une variable) mais un type de données
            //TypeRefExemple.nomEtudiant = "test";

            // la ligne suivante ne compile pas:Etudiant3_TypeRef ne fait référence pour l'instant à aucun objet
            //varTypeRef1.nomEtudiant = "test";

            varTypeRef1 = varTypeRef2;// 1 seul objet en mémoire  mais 2 références 
            Console.WriteLine("Etud : {0} // {1}", varTypeRef1.note, varTypeRef1.nomEtudiant);
            // la note de l'étudiant 3 est modifiée
            varTypeRef1.note = 20;
            // ce changement aparait aussi sur l'etudiant4
            Console.WriteLine("Etud : {0} // {1}", varTypeRef2.note, varTypeRef2.nomEtudiant);
            // NORMAL: 1 seul objet mais 2 référence à ce même objet!
            
            Console.ReadKey();// attente touche
        }
    }
}
