以下是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对象没有考虑字符串对象)
希望这个问题不是愚蠢的。
答案 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。