昨夜飘风
昨 夜, 风, 飘 过; 枯 树, 叶, 飞 落。
 前些天,这个平时让我不以为然的引用传递烦了我好些时间。C#中值传递的类型只有有int、float、double、string、bool、byte等的一些很基本的类型和struct类型,其他自己定义的对象类型都式引用传递的。举个例子:

             ArrayList a = new ArrayList();
            a.Add("hihi");
            ArrayList b = new ArrayList();
            b = a;
            b[0] = "bye";

      猜猜a会变成什么?oh!a[0]是"bye"! 这就是传说中的引用传递。 这个例子不够说服力吧,,再看看一个自定义类:

            public class UserCls
            {
                 public string name;
                  public int id;
             }

     看看如下语句:

            UserCls yao = new UserCls();
            yao.name = "姚明";
            yao.id = 11;
            UserCls Mac = yao;
            Mac.name = "麦基迪";
            Mac.id = 1;

     如此一来yao的信息就变了,变成yao.name = "麦基迪",yao.id = 1。来个基本的string 类型对比一下:
             string yao = "姚明";
             string Mac = yao;
             Mac = "麦基迪";

     结果是,yao = "姚明",Mac = "麦基迪",这就是值传递了。

     但是我们的函数的参数类型经常是自定义类(对象类型),所以要小心了,如果函数对该参数做了改变,那么原来的数据就会跟着修改,深奥的东西不说,看看如下例子吧:

         private void button_Click(object sender, EventArgs e)
        {

            ArrayList a = new ArrayList();
            a.Add("hihi");
            ArrayList b = Creat(a);

        }

        public ArrayList Creat(ArrayList a)
        {
            ArrayList copy =new ArrayList();
            copy = a;
            copy[0] = "copy";
            return copy;
        }

     那么Creat(a)调用后,a[0]就是"copy"了,如何才能不改变a呢,将函数改成:

        public ArrayList Creat(ArrayList a)
        {
            ArrayList copy =new ArrayList();
            foreach (object obj in a)
            {
                copy.Add(obj);//每个obj必须是值传递类型
            }
            return copy;
        }

      这样Creat(a)调用后,a仍然不变。函数里面提到 “每个obj必须是值传递类型”,原理也是一样的,如果是值传递类型,那么当copy提取出该obj又改变了它的时候,a中的该obj也是跟着变的。

       那么,自定义类型的时候就可以添加一个函数来复制自己,进而不会改变自身,从而达到“值传递”的效果,如下:

    public class UserCls
    {
        public string name;
        public int id;
        public UserCls Copy()
        {
            UserCls c = new UserCls();
             c.name = name;
            c.id=id;

           return c;
        }
    }

那么,

            UserCls yao = new UserCls();
            yao.name = "姚明";
            yao.id = 11;
            UserCls Mac = yao.Copy();
            Mac.name = "麦基迪";
            Mac.id = 1;

Mac改变后yao也不会改变,我们改变的只是yao的复制品而已。

 

PS:知识是靠一点一点积累的!

posted on 2009-03-21 17:09  昨夜飘风  阅读(530)  评论(0编辑  收藏  举报