c#代码中没有对象和引用,c#中的垃圾收集

时间:2015-02-11 09:17:04

标签: c# garbage-collection

以下是c#代码,其中我必须找出整个代码后的对象数(DOG)和引用。最初我计算它是4个对象和8个引用。但在看到这个问题之后 Garbage collector test,(表示垃圾收集器只在系统内存不足和其他类似原因时运行)我怀疑对象的数量是否应为6?以下问题没有说明程序获得的内存。

所以我的问题是,如果我得到这类问题应该是我的答案(4,6或者我应该说它取决于记忆)?

 Dog rover = new Dog();
 rover.Breed = “Greyhound”;
 Dog rinTinTin = new Dog();
 Dog fido = new Dog();
 Dog quentin = fido;

 Dog spot = new Dog();
 spot.Breed = “Dachshund”;
 spot = rover;

 Dog lucky = new Dog();
 lucky.Breed = “Beagle”;
 Dog charlie = fido;
 fido = rover;
 rinTinTin = lucky;

 Dog laverne = new Dog();
 laverne.Breed = “pug”;
 charlie = laverne;
 lucky = rinTinTin;

//此时没有对象和引用?(DOG对象没有考虑字符串对象)

希望这个问题不是愚蠢的。

4 个答案:

答案 0 :(得分:2)

对于几乎所有目的,垃圾收集器的操作超出范围,您不必担心。

计算在这里创建的" Dog"对象的数量就像计算次数一样简单" new Dog()"出现;每个都创建了一个新对象。

Matthew所述,字符串也是对象;我要注意你是否应该计算这些数量,但这会使它总数达到10个。

答案 1 :(得分:1)

这是6.为了澄清答案,改变Dog类如下:

public class Dog
{
    static int counter = 0;

    public string Breed { get; set; }

    public Dog()
    {
        Interlocked.Increment(ref counter);
    }

    ~Dog()
    {
        Interlocked.Decrement(ref counter);
    }
}

静态属性计数器将计算内存中 Dog 类的实例。还有更多解释here

答案 2 :(得分:1)

每次调用new都会创建一个新对象(因此也会对其进行新的引用)。 GC不是确定性的,因此当您超出变量范围时,无法确定有多少对象仍处于活动状态。所以你的答案都不对,它完全取决于GC认为好的。

只要您处于对象范围内,您当然可以计算它们,因为已经告诉Rik。话虽如此,你有6个对象(不包括4个字符串)。

答案 3 :(得分:0)

每个new关键字意味着您在堆上分配一个新对象。所以我算了6个Dog类型的对象。其中4只狗有String个物体。所以,10。