2015-02-11 22 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