2015-02-11 64 views
0

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

所以我的问题是如果我得到这种类型的问题应该是我的答案(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对象不考虑字符串对象)

希望这问题不傻。

+1

我认为你必须忽略这个问题的垃圾回收,因为它在运行时是不确定的。还要注意,字符串是对象,并且在您的示例代码中,“Dog.Breed”是对字符串的引用。 – 2015-02-11 09:25:49

+0

@MthetheWWatson ....我只对狗物件感兴趣。但谢谢你指出。 – dividedbyzero 2015-02-11 09:29:46

回答

1

正是6.要明确的答案改变狗类像下面这样:

public class Dog 
{ 
    static int counter = 0; 

    public string Breed { get; set; } 

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

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

静态属性计数器在内存计数类的实例。有更多解释here

+0

....在哪个命名空间中存在InterLocked类? – dividedbyzero 2015-02-11 09:42:25

+0

System.Threading – user3021830 2015-02-11 09:43:48

2

几乎所有的目的,垃圾收集器的操作超出了范围,你不应该担心它。

计算此处创建的“Dog”对象的数量与计算“new Dog()”出现次数一样简单;每个人创建一个新的对象。

As Matthew笔记,字符串也是对象;我注意到知道你应该算的,还有,但是这将使它共有10

+3

我想你忘了一句话:“不用担心” – 2015-02-11 09:28:23

+0

还有'rover.Breed =“Greyhound”;'创建一个对象(一个字符串)。但是,由于字符串实际上它开始变得非常复杂 - 因为如果在其他地方创建了相同的常量字符串,则可能不会创建新的字符串对象! – 2015-02-11 09:28:54

+0

@SebastianNegraszus谢谢,修复 – Rik 2015-02-11 09:30:51

1

new每个呼叫都将创建一个新的对象(以及为此也是一个新的参考吧) 。 GC不是确定性的,所以当你超出变量范围时,你不能确定有多少对象仍然存在。所以你的答案都不会是对的,它完全取决于GC认为是好的。

只要你在你的对象的范围内,你当然可以数它们,因为Rik已经告诉。说了这个,你有6个对象(不包括4个字符串)。

+0

@HimBromBeere ....在你的对象范围内意味着什么? – dividedbyzero 2015-02-11 10:00:42

+0

It mea ns,你在同一个方法/ class/block/...中定义了变量。如果你是一个实例的方法并且定义了这些对象,那么这个方法就是你的范围和对象在这个方法中一样长。因此你不能从这个方法之外访问它们。 – HimBromBeere 2015-02-11 10:03:23

0

每个new关键词意味着你在堆上分配一个新的对象。所以我计算了Dog类型的6个对象。这4只狗有一个String对象。所以,10