当前位置:编程学习 > C#/ASP.NET >>

C#参数传递时到底发生了什么

 

1、 引用类型的变量只包含对象所在的内存地址,将要复制的是内存地址而不是对象本身,所以对底层对象的修改会保留。

unsafe class Program

{

    static void Main(string[] args)

    {

        Employee myE = new Employee() { id=4};

 

        fixed (int* pId=&(myE.id))

        {

            Console.WriteLine("方法执行前,myE中id的地址为0x{0:X},值为{1}", (uint)&(*pId), (uint)*pId);

        }

        testMethod(myE);

        fixed (int* pId = &(myE.id))

        {

            Console.WriteLine("方法执行后,myE中id的地址为0x{0:X},值为{1}", (uint)&(*pId), (uint)*pId);

        }

        Console.ReadLine();

        

    }

    static void testMethod(Employee myE)

    {

        myE.id = 5;

        //myE = new Employee() { id = 5 };

        fixed (int* pId = &(myE.id))

        {

            Console.WriteLine("方法执行中,myE中id的地址为0x{0:X},值为{1}", (uint)&(*pId), (uint)*pId);

        }

    }

}

输出为:

方法执行前,myE中id的地址为0x1AF5BE0,值为4

方法执行中,myE中id的地址为0x1AF5BE0,值为5

方法执行后,myE中id的地址为0x1AF5BE0,值为5

执行过程为:

1)  在堆中新建对象myE,在栈中建立指向myE的指针

2)  按引用传递,所以在栈中新建指针,复制上面指针的地址,也指向myE

如下图所示:

\

 

2、 如果在方法内部将内存地址指向一个新对象,则方法结束后在方法中所作的修改会被丢弃(原指针仍指向原对象,方法参数指向新对象,结束后一起销毁)。

unsafe class Program

{

    static void Main(string[] args)

    {

        Employee myE = new Employee() { id=4};

 

        fixed (int* pId=&(myE.id))

        {

            Console.WriteLine("方法执行前,myE中id的地址为0x{0:X},值为{1}", (uint)&(*pId), (uint)*pId);

        }

        testMethod(myE);

        fixed (int* pId = &(myE.id))

        {

            Console.WriteLine("方法执行后,myE中id的地址为0x{0:X},值为{1}", (uint)&(*pId), (uint)*pId);

        }

        Console.ReadLine();

        

    }

    static void testMethod(Employee myE)

    {

        //myE.id = 5;

        myE = new Employee() { id = 5 };

        fixed (int* pId = &(myE.id))

        {

            Console.WriteLine("方法执行中,myE中id的地址为0x{0:X},值为{1}", (uint)&(*pId), (uint)*pId);

        }

    }

}

输出为:

方法执行前,myE中id的地址为0x1E77BE0,值为4

方法执行中,myE中id的地址为0x1E78E24,值为5

方法执行后,myE中id的地址为0x1E77BE0,值为4

执行过程为:

1)  在堆中新建对象myE,在栈中建立指向myE的指针

2)  按引用传递,所以在栈中新建指针,复制上面指针的地址,也指向myE

3)  方法中new一个新对象时,在堆中新建对象,并把地址传给指针2

 

\



摘自 挂在墙上的天堂
补充:软件开发 , C# ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,