属性和方法调用不允许作为ref或out参数值使用

C#允许属性像字段那样使用,只是不允许将它们作为ref或out参数值来传递。ref和out参数值在内部实现时,需要将内存地址传给目标方法。但是,由于属性可能是没有支持字段的虚字段,也有可能是只读/只写的,因此不可能传递其基础存储的地址。所以,你不能将属性作为ref或out参数值来传递。同样的道理也适用于方法调用。如果需要将一个属性或者方法调用作为ref或out参数值来传递,首先必须将值复制到一个变量中,然后传递该变量。方法调用结束之后,再将变量的值赋回属性。

  public class Classmates

        {
            public Person[] Students { getset; }
            public Person Master { getset; }
            public int Age { getset; }
        }


        static void Main()
        {
            Classmates class1 = new Classmates();
            Person[] Students = new Person[] { new Person() { Name = "Jim" }, new Person() { Name = "Tom" } };
            Person master = new Person() { Name = "JuanJuan" };
            class1.Students = Students;
            class1.Master = master;
            class1.Age = 10;
            ChangeName(ref class1.Students[0]);
            //ChangeAge(ref class1.Age);
            
//ChangeMasterName(ref class1.Master);

            foreach (var student in Students)
            {
                Console.WriteLine(student.Name);
            }
            System.Console.ReadKey();
        }

        static void ChangeName(ref Person p)
        {
            p = new Person();
            p.Name = "New Guy";
        }

        static void ChangeMasterName(ref Person p)
        {
            p = new Person();
            p.Name = "New Master";
        }
        static void ChangeAge(ref int Age)
        {
            Age = 10;
        }

posted @ 2012-05-26 21:51  chunchill  阅读(1285)  评论(0编辑  收藏  举报