333 votes

Passage d'objets par référence ou par valeur en C#

En C#, j'ai toujours pensé que les variables non primitives étaient transmises par référence et les valeurs primitives transmises par valeur.

Ainsi, lorsqu'on passe à une méthode un objet non primitif, tout ce qui est fait à l'objet dans la méthode affecte l'objet passé. (C# 101 trucs)

Cependant, j'ai remarqué que lorsque je passe un objet System.Drawing.Image, cela ne semble pas être le cas ? Si je passe un objet system.drawing.image à une autre méthode, et que je charge une image sur cet objet, puis que je laisse cette méthode sortir de son champ d'application et que je reviens à la méthode appelante, cette image n'est pas chargée sur l'objet original ?

Pourquoi ?

29 votes

Toutes les variables sont transmises par valeur par défaut en C#. Vous passez la valeur de la référence dans le cas des types de référence.

0 votes

0 votes

Comme aucun code n'a été donné, la question n'est pas vraiment claire. Peut-être que le PO voulait dire image.Load(filename) ou peut-être qu'ils voulaient dire image = Image.Load(filename) donde image est le paramètre de la fonction.

4voto

dotnetstep Points 2876

Comment avez-vous passé l'objet à la méthode ?

Faites-vous du new dans cette méthode pour l'objet ? Si oui, vous devez utiliser ref en méthode.

Le lien suivant vous donnera une meilleure idée.

http://dotnetstep.blogspot.com/2008/09/passing-reference-type-byval-or-byref.html

3voto

Mayur Pawar Points 63
Employee e = new Employee();
e.Name = "Mayur";

//Passes the reference as value. Parameters passed by value(default).
e.ReferenceParameter(e);

Console.WriteLine(e.Name); // It will print "Shiv"

 class Employee {

   public string Name { get; set; }

   public void ReferenceParameter(Employee emp) {

     //Original reference value updated.
    emp.Name = "Shiv";

    // New reference created so emp object at calling method will not be updated for below changes.
    emp = new Employee();
    emp.Name = "Max";
  }
}

-2voto

user5593590 Points 9

Dans Pass By Reference, il suffit d'ajouter "ref" dans les paramètres de la fonction. autre chose, vous devriez déclarer la fonction "static" car main est static(#). public void main(String[] args) ) !

namespace preparation
{
  public  class Program
    {
      public static void swap(ref int lhs,ref int rhs)
      {
          int temp = lhs;
          lhs = rhs;
          rhs = temp;
      }
          static void Main(string[] args)
        {
            int a = 10;
            int b = 80;

  Console.WriteLine("a is before sort " + a);
            Console.WriteLine("b is before sort " + b);
            swap(ref a, ref b);
            Console.WriteLine("");
            Console.WriteLine("a is after sort " + a);
            Console.WriteLine("b is after sort " + b);  
        }
    }
}

-2voto

Sujoy Points 88

Dans la dernière version de C#, qui est C# 9 à l'heure où nous écrivons ces lignes, les objets sont transmis par défaut par le biais de ref . Ainsi, toute modification apportée à l'objet dans la fonction appelante persistera dans l'objet dans la fonction appelée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X