2014-03-27 57 views
0

以下代碼片段中Employee實例的生命期會發生什麼?實例在沒有分配給變量時的位置?

Department dept = new Employee(10).GetDepartment(); 

Employee類被創建並且未被賦值給任何變量。員工實例在這種情況下持續多久?

這樣做有沒有負面影響?

回答

2

你可以認爲它是這樣的:

Employee __temp = new Employee(10); 
Department dept = __temp.GetDepartment(); 

這是不是真的發生了什麼,但它有助於解釋發生了什麼有用的。

在這種情況下,__temp符合資格的到由垃圾收集儘快__temp.GetDepartment()完成執行清理。它不會收集實際上,直到發生下一次垃圾回收循環,這會在運行時確定它是必要的時候發生。像

Department dept = new Employee(10).GetDepartment(); 

編寫代碼簡單地把你從自己申報的中間變量。編寫這樣的代碼沒有負面影響,這是非常普遍的做法。

1:有辦法手動強制收集週期,但99.9%的時間你不需要,不應該這樣做。

+0

這是一個誤導性的答案。它使得它聽起來像編譯器創建了一個臨時變量,該臨時變量會阻止收集「Employee」實例,直到臨時變量超出範圍,而不是立即符合條件。 – Enigmativity

+0

+1。 @Enigmativity - 不,臨時變量的創建絕不會改變GC優化後最後一次使用後非優化構建/ JIT中全部方法的結束時間。 –

+0

@Enigmativity我不認爲這與事實相去甚遠。編譯器在技術上並沒有創建一個變量,因爲不會使用'stloc'指令。但是,在調用'GetDepartment()'之前,對'Employee'的新實例的引用確實會被推入棧中,並且從某種意義上講,您可以將其視爲一個匿名變量。 –

2

它將被垃圾收集爲任何其他物體。如果沒有引用該對象,則立即爲符合條件的

注意GetDepartamet()可以(也將在這種特殊情況下被怪)不斷提及「員工」:

Department GetDepartment() 
{ 
    return new Department { OnlyEmployee = this} 
} 

是否有任何負面影響:沒有,但每個人都會問,每次這個確切的問題閱讀代碼。

+0

@fnostro是正確的,但沒有任何意義。 – CodeCaster

+0

我刪除了我的評論,但你是對的,但OP想知道員工什麼時候會GC'd,答案真的是,'這取決於' – fnostro