类A中有方法fa1和fa2。这两个方法都实现了对类B的实例化,而且语句一样,既实例化的参数名一样。
public void fa1
{
B b = new B();
}
public void fa2
{
B b = new B();
}
现在实例化A后调用fa1然后再调用fa2,不会出现冲突,为什么?
调用fa1后b是什么状态?可以再调用fa1?

解决方案 »

  1.   

    问题1:两个方法中的b都属于方法体内的局部变量,局部变量的作用域就在方法体内。
    问题2:调用完fa1后,b的去处你就不用管了,垃圾收集器去处理了。
      

  2.   

    不会冲突。
    fa1中的B类对象b与fa2中的B类对象b,不是同一个实例。
      

  3.   

    fa1中的b和fa2中的b是两码事,它们是局部变量,从C的角度,fa1.b和fa2.b所占用的内存,在跳出函数的时候已经被释放了;从C#的角度,在跳出函数的时候,对各个b的引用已经为空了
      

  4.   

    此b非彼b也。关键是此2位住在不同内存空间之中。b只是其门牌号码而已。
    其门牌号码分别为fb1.b  fb2.b  就像上海 武汉 都有南京路
      

  5.   


    对b的引用为空,我的这种说法可能更加深刻了一点。我的意思是,b或许还存在,或许在离开函数的时候,就立刻被垃圾回收,这个时间不能确定。但确定的是,b迟早会被垃圾回收(因为B是引用类型,分配在托管堆上),要被垃圾回收的前提就是,没有任何一个对象保持着对它的引用,也就是,对b的引用为空。
      

  6.   

    垃圾回收机制是CLR中的机制,垃圾回收是分“代”(generation)的。
    具体怎么做的,这又是一个可以深入研究的话题。