ref关键字,由C#关键字ref想到的

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

延伸阅读

最新评论

发表评论