Frage

Also, wenn ich Iterieren eine foreach-Schleife, und ich habe eine Funktion im Innern, dass ein Argument des Objekts aus der Liste iteriert, und kann sagen, dass ich seinen Wert gesetzt, anders zu sein. Warum nicht muss ich verwenden oder ref? Ich dachte, es nur von Wert übergeben wurde, wenn es Sie nicht verwenden oder ref .... Ich weiß, dass ref Sie die Variable initialisiert müssen, bevor und aus Sie gerade vor der Rückkehr seinen Wert gesetzt haben aus dem Verfahren müssen.

Es scheint, als wenn Sie durch eine Liste eines Iterieren und ein Objekt in seinem tatsächlich weitergegeben als Verweis übergeben. Betrachten Sie das folgende Beispiel.

Beispiel

class Program
    {
        static void Main(string[] args)
        {

            List<Foo> list = new List<Foo>();
            list.Add(new Foo() { Bar = "1" });
            list.Add(new Foo() { Bar = "2" });



            foreach (var f in list)
            {
                Foo f2 = f; 
                Console.WriteLine("SetFoo Pre: " + f2.Bar);
                SetFoo(f2);
                Console.WriteLine("SetFoo Post: " + f2.Bar);

                Console.WriteLine("SetFooRef Pre: " + f2.Bar);
                SetFooRef(ref f2);
                Console.WriteLine("SetFooRef Post: " + f2.Bar);
                Console.WriteLine("");
            }




            Console.WriteLine("");

            int i = 0;
            // Not using ref keyword
            Console.WriteLine("SetI Pre: " + i);
            SetI(i);
            Console.WriteLine("SetI Post: " + i);

            // Using ref keyword
            Console.WriteLine("SetRefI Pre: " + i);
            SetRefI(ref i);
            Console.WriteLine("SetRefI Post: " + i);
        }


        private static void SetRefI(ref int i)
        {
            i = 3;
            Console.WriteLine("SetRefI Inside: " + i);
        }

        private static void SetI(int i)
        {
            i = 2;
            Console.WriteLine("SetI Inside: " + i);
        }

        private static void SetFooRef(ref Foo f)
        {
            f.Bar = String.Format("{0} :: {1}", f.Bar, "WithRef");
            Console.WriteLine("SetFooRef Inside: " + f.Bar);
        }

        private static void SetFoo(Foo f)
        {
            f.Bar = String.Format("{0} :: {1}", f.Bar, "WithoutRef");
            Console.WriteLine("SetFoo Inside: " + f.Bar);
        }
    }


    class Foo
    {
        public string Bar { get; set; }
    }

Ausgabe:

  

setFoo Pre: 1 setFoo Innen: 1 ::
  WithoutRef setFoo Beitrag: 1 WithoutRef
  SetFoo Pre: 1 :: WithoutRef setFoo
  Innen: 1 :: WithoutRef :: mitref
  SetFoo Beitrag: 1 WithoutRef :: mitref

     

setFoo Pre: 2 setFoo Innen: 2 ::
  WithoutRef setFoo Beitrag: 2 WithoutRef
  SetFoo Pre: 2 :: WithoutRef setFoo
  Innen: 2 :: WithoutRef :: mitref
  SetFoo Beitrag: 2 WithoutRef :: mitref

     

SETI Pre: 0 SETI Innen: 2 SetIPost: 0

     

SetRefI Pre: 0 SetRefI Innen: 3
  SetRefI Beitrag: 3

Ich verstehe die ref mit dem ganzzahligen Beispiel, aber nicht das oben Foo Objekt Iteration Beispiel.

Danke!

War es hilfreich?

Lösung

Die Hinweis wird als Wert übergeben. So kann das Verfahren noch den Inhalt des Objekts ändern, es kann einfach nicht ändern, welche das Objekt Ihre Variable bezieht sich auf.

Siehe meinen Artikel über die Parameter für viel mehr Informationen vorbei , zusammen mit meinem Artikel über Referenztypen und Werttypen .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top