请问大家一个关于引用传参的问题,希望得到原理上的解答,代码如下
using System;using System.Collections.Generic;
using System.Text;
namespace test
{
class Program
{
static void Main(string[] args)
{
Person person1 = new Person();
SetPerson( person1);
}
private static void SetPerson(Person person, string ss)
{
person = new Person();
person.Id1 = Guid.NewGuid().ToString();
person.Name1 = "张三";
person.Age1 = 22;
}
}
public class Person
{
string Id = string.Empty;
public string Id1
{
get { return Id; }
set { Id = value; }
}
string Name = string.Empty;
public string Name1
{
get { return Name; }
set { Name = value; }
}
int Age = 0;
public int Age1
{
get { return Age; }
set { Age = value; }
}
}
}
在主函数MAIN中调用SetPerson方法,个person对象传递了过去,在SetPerson中队person重新实例化了一下,这次实例化person发生了什么变化,导致引用传参赋值失败?希望大家能从原理上给我解答。 --------------------编程问答-------------------- new运算符会新生成一个实例,=(赋值运算符)将生成的实例的引用赋给变量person,这时候person的引用就不是传进来的那个了。相当于一个指针原本指向传进来的对象的内存地址,new创建实例会在内存中新开辟一块区域去存储对象,然后将内存的地址赋给指针,此时这个指针指向的就是新的地址,在外部调用看到的就是新的数据。 --------------------编程问答--------------------
private static void SetPerson(Person person, string ss)
{
person = new Person(); //将变量 person 指向一个新的Person实例,该实例在 heap 中分配内存
person.Id1 = Guid.NewGuid().ToString();
person.Name1 = "张三";
person.Age1 = 22;
}
下面的地址讲了一些关于内存管理的知识,你可以看看。
http://www.cnblogs.com/jiejie_peng/archive/2011/04/24/2026272.html
补充:.NET技术 , C#