سؤال

وحتى لو كنت أنا بالتكرار باستخدام حلقة foreach ولدي وظيفة داخل أن يأخذ حجة الكائن كرر من القائمة، ودعونا نقول ط تعيين قيمته في أن تكون مختلفة. لماذا لا بد لي من استخدام الخروج أو المرجع؟ اعتقدت صدر فقط من قبل القيمة إذا كنت لا تستخدم خارج أو المرجع .... أنا أعرف أن المرجع يجب أن لديك تهيئة المتغير قبل ويخرجون عليك أن تحدد قيمتها قبل العودة من الأسلوب.

ويبدو مثل إذا كنت على بالتكرار من خلال قائمة وتمرير كائن في تقريرها مرت فعلا بالرجوع. النظر في المثال التالي.

مثال

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; }
    }

وإخراج:

<اقتباس فقرة>   

وSetFoo قبل: 1 SetFoo في الداخل: 1 ::
  WithoutRef SetFoo رد: 1 WithoutRef
  SetFoo قبل: 1 :: WithoutRef SetFoo
  في الداخل: 1 :: :: WithoutRef WithRef
  SetFoo رد: 1 WithoutRef :: WithRef

     

وSetFoo قبل: 2 SetFoo في الداخل: 2 ::
  WithoutRef SetFoo المشاركة: 2 WithoutRef
  SetFoo قبل: 2 :: WithoutRef SetFoo
  في الداخل: 2 :: :: WithoutRef WithRef
  SetFoo المشاركة: 2 WithoutRef :: WithRef

     

سيتي قبل: 0 سيتي في الداخل: 2 SetIPost: 0

     

وSetRefI قبل: 0 SetRefI في الداخل: 3
  SetRefI رد: 3

وأنا أفهم المرجع مع المثال عدد صحيح ولكن ليس الكائن فو أعلاه التكرار سبيل المثال.

وشكرا!

هل كانت مفيدة؟

المحلول

المرجع <م> يتم تمريرها من حيث القيمة. وبالتالي فإن طريقة لا يزال تغيير محتويات الكائن، فإنه فقط لا يمكن تغيير أي كائن متغير الخاص يشير إلى.

مقالتي على المعلمة التي تمر للحصول على الكثير من المعلومات، جنبا إلى جنب مع مقالتي حول <أ href ل = "http://pobox.com/~skeet/csharp/references.html"> أنواع المراجع وأنواع قيمة .

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top