不是一个喜欢抠文法的人,但对C#里面的ref很感兴趣。C#里面有很多数据类型都是引用类型的,作为参数传递时,是无需要拷贝的。因此ref主要修饰的不是引用类型,而是值类型(以及string这种特殊的引用类型).那是不是除string外的引用类型都不要ref呢,我认为答案是否定的,下面的代码比较有意思,有很多人不仔细看,还看不出list的变化。
1: static void Main(string[] args)2: {3: List<string> list = new List<string>();4: Test test = new Test();
5: test.AddOne(list); //执行该条语句后 list集合元素个数为0个
6: test.AddTwo(list); //执行该条语句后 list集合元素个数为1个 是“2”
7: test.AddTree(ref list);执行该条语句后 list集合元素个数为1个 是“3”
8: }9: class Test
10: {11: public void AddOne(List<string> l)12: {13: List<string> ll = new List<string>();14: ll.Add("1");
15: l = ll;16: }17: public void AddTwo(List<string> l)18: {19: l.Add("2");
20: }21: public void AddTree(ref List<string>l)22: {23: List<string> ll = new List<string>();24: ll.Add("3");
25: l = ll;26: }27:28: }29:30:
AddOne函数里,传进去的list指向了另一个地址,函数返回时,list里面的元素是0个。
AddTwo函数不用说,无疑问。函数返回时,list里面有一个元素为”2”.
AddThree函数,传进去的list也指向了另一个地址,函数返回时,list里面的只有一个元素为”3”
那我可不可认为C#里面的ref和C++里面的&有着本质的区别?我们在平时写代码传递参数(该参数需要返回)时不管是引用类型还是值类型,是否都应该加上ref修饰,我们也许会调用别人写的函数,这样我们不确定我们传进去的参数会做怎样的处理。