一个基础题,不注意就错了
这是个挺基础的题,无论是高手与否,看看也无妨。
namespace NameSpace
{
class A
{
public string Value { get; set; }
}
class Program
{
static void Process1(A pa)
{
A aa = new A { Value = "Process1" };
pa = aa;
}
static void Process2(A pb)
{
pb.Value = "Process2";
}
static void Main(string[] args)
{
A a1, a2;
a1 = new A { Value = "a1" };
a2 = new A { Value = "a2" };
Console.WriteLine("没有调用函数前:");
Console.WriteLine("a1.Value={0}", a1.Value);
Console.WriteLine("a2.Value={0}", a2.Value);
Process1(a1);
Process2(a2);
Console.WriteLine("\n调用函数后:");
Console.WriteLine("a1.Value={0}", a1.Value);
Console.WriteLine("a2.Value={0}", a2.Value);
}
}
}
{
class A
{
public string Value { get; set; }
}
class Program
{
static void Process1(A pa)
{
A aa = new A { Value = "Process1" };
pa = aa;
}
static void Process2(A pb)
{
pb.Value = "Process2";
}
static void Main(string[] args)
{
A a1, a2;
a1 = new A { Value = "a1" };
a2 = new A { Value = "a2" };
Console.WriteLine("没有调用函数前:");
Console.WriteLine("a1.Value={0}", a1.Value);
Console.WriteLine("a2.Value={0}", a2.Value);
Process1(a1);
Process2(a2);
Console.WriteLine("\n调用函数后:");
Console.WriteLine("a1.Value={0}", a1.Value);
Console.WriteLine("a2.Value={0}", a2.Value);
}
}
}
没有调用函数前:
a1.Value= a1
a2.Value= a2
调用函数后:
a1.Value=a1
a2.Value=Process2
这是个什么原因?是引用类型的引用啊?这究竟是为什么呢?我试想了下,根据线程堆栈的方法来解答吧,若有不对,请各位指出,互相学习。
这是还没有调用函数前对象引用

在调用函数后:

在主函数里,定义了a1,a2两个变量,分别指向了托管堆里开辟的空间。在调用自定义函数的时候,pa和pb分别指向了a1和a2在托管堆里所开辟的空间。注意的是,“A类型对象”是class A{},它是System.Type的一个实例,“A对象”就是平常所说的“实例化对象”,像“a1,a2”。在“Process1函数”里,对“pa”进行了新一轮的实例化,使得原本与a1指向同一个空间的,经过了这个new后,在托管堆里开辟了新的空间,然后指向了它。等“Process1函数”调用结束后返回main函数时,pa的值范围只在"Process1函数"里,a1对象里的Value值却没有改动。而“Process2函数”里,“pb”指向的空间跟a2一样,只是把属性Value的值改成“Process2”,等“Process2函数”调用结束,返回main函数时,a2所指向空间里的属性Value的值就已改变,所以会得出不同的结果。


浙公网安备 33010602011771号