日期:2014-05-18  浏览次数:20743 次

关于c#中按引用传递对象的一点疑惑

记得《C#经典入门(第5版)》中提到过:除了值类型的对象,其他对象都是按引用传递。

所以在下面的例子中,Init()执行完后,aaa新增了一个元素1.
C# code

class test1
{
    public test1()
    {
        var aaa = new List<int>();
        Init(aaa);
    }

    private void Init(List<int> zzz)
    {
        zzz.Add(1);
    }
}



引起我困惑的主要是下面两个例子,Init()执行完后,aaa没有变化.
C# code

class test2
{
    public test2()
    {
        List<int> aaa = null;
        Init(aaa);
    }

    private void Init(List<int> zzz)
    {
        zzz = new List<int>();
    }
}



C# code

class test3
{
    public test3()
    {
        List<int> aaa = new List<int>();
        aaa.Add(1);
        Init(aaa);
    }

    private void Init(List<int> zzz)
    {
        zzz = new List<int>();
        zzz.Add(111);
    }
}



但加上out或ref之后,Init()执行完后,aaa会发生改变.
C# code

class test4
{
    public test4()
    {
        List<int> aaa = null;
        Init(out aaa);
    }

    private void Init(out List<int> zzz)
    {
        zzz = new List<int>();
    }
}



最后,我的问题是:为什么test2和test3中aaa没有发生变化?
谢谢您耐心看完我的问题,期待您的解答。


------解决方案--------------------
先看这篇吧

上面那个放这个后面看