所以如果我迭代使用foreach循环和我有一个功能内部,需要争论的对象迭代从名单,并可以说我设置了它的价值是不同的。为什么我不需要使用或ref?我以为这只是传递的价值如果你没有使用或参考。...我知道,ref你必须具有初始化的变量之前,你只需要设置它之前的价值回报的方法。

这似乎是如果你一个迭代过一个列表,并通过一个目在其实际通过参考。考虑下述例子。

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预:1SetFoo内:1::
WithoutRef SetFoo员额:1WithoutRef
SetFoo预:1::WithoutRef SetFoo
内部:1::WithoutRef::WithRef
SetFoo员额:1WithoutRef::WithRef

SetFoo预:2SetFoo内:2::
WithoutRef SetFoo员额:2WithoutRef
SetFoo预:2::WithoutRef SetFoo
内部:2::WithoutRef::WithRef
SetFoo员额:2WithoutRef::WithRef

塞提前:0塞提里面:2SetIPost:0

SetRefI预:0SetRefI内:3
SetRefI员额:3

我理解参与整数例子,但不上述Foo对象迭代的例子。

谢谢!

有帮助吗?

解决方案

参考 通过价值。因此该方法仍然可以改变其内容的对象,它只是不能改变其对象变量指。

看看 我的文章上的参数过 更多的信息,随着我的文章 参照类型和价值的类型.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top