一个基础题,不注意就错了

这是个挺基础的题,无论是高手与否,看看也无妨。

namespace NameSpace
{
    
class A
    {
        
public string Value { getset; }
    }

    
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的值就已改变,所以会得出不同的结果。 

posted @ 2010-08-10 03:33  年轻国王  阅读(179)  评论(1)    收藏  举报