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


Answers

Un exemple de code supplémentaire pour présenter ceci:

void Main()
{


    int k = 0;
    TestPlain(k);
    Console.WriteLine("TestPlain:" + k);

    TestRef(ref k);
    Console.WriteLine("TestRef:" + k);

    string t = "test";

    TestObjPlain(t);
    Console.WriteLine("TestObjPlain:" +t);

    TestObjRef(ref t);
    Console.WriteLine("TestObjRef:" + t);
}

public static void TestRef(ref int i)
{
    i = 5;
}

public  static void TestPlain(int i)
{
    i = 5;
}

public static void TestObjRef(ref string s)
{
    s = "TestObjRef";
}

public static void TestObjPlain(string s)
{
    s = "TestObjPlain";
}

Et la sortie:

TestPlain: 0

TestRef: 5

TestObjPlain: test

TestObjRef: TestObjRef

Question

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

Ainsi, lors du passage à une méthode d'un objet non primitif, tout ce qui est fait à l'objet dans la méthode affecterait l'objet qui est passé. (C # 101 choses)

Cependant, j'ai remarqué que quand 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 charge une image sur cet objet, alors laissez cette méthode sortir de la portée et revenir à la méthode d'appel, cette image n'est pas chargée sur l'objet d'origine?

Pourquoi est-ce?




In Pass By Reference Vous ajoutez seulement "ref" dans les paramètres de la fonction et encore une chose vous devriez déclarer la fonction "static" car la 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);  
        }
    }
}






Links