值类型和引用类型
c#类型分为值类型和引用类型
值类型赋值或者传递时候,都会复制一分数据,所以改变新数据值的时候并不会改变原来数据
而引用类型的赋值与传递时,C#会复制一份引用地址,因此改变新变量值时候,会影响到原来的变量
测试如下代码:
class Program
{
static void Main(string[] args)
{
Person p = new Person { Name = "Chris", Gender = "Male" };
Person p1 = p;
p = null;
try
{
Console.WriteLine(p1.Name);
}
catch(Exception ex)
{
throw ex;
}
Console.Read();
}
private static void Change(Person p)
{
p = null;
return;
}
}
public class Person:Object
{
public Person()
{}
public string Name = "";
public string Gender = "";
public void getName()
{
return;
}
}
最开始我以为会抛出“未将对象引用设置到对象实例”的异常,但是实际上并无异常,且输出“Chris”
这里将p置为null,只是将p的地址设置为null,而其真实内容依然存在内存中,同时也存在p1对这些数据的引用。
因此数据不会被释放,p1.Name还是“Chris”
同样道理 将 p = null; 改成change(p1)传入时,会复制一份p1的地址,假设为p2,进入到change函数体后,将p2置为null,同样
改变的只是p2的地址,而p1并不为空,如果要使p1为空,则可以在参数中加ref 或者out
http://msdn.microsoft.com/en-us/library/ms229614.aspx