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:知识是靠一点一点积累的!