以下代碼片段中Employee實例的生命期會發生什麼?實例在沒有分配給變量時的位置?
Department dept = new Employee(10).GetDepartment();
Employee類被創建並且未被賦值給任何變量。員工實例在這種情況下持續多久?
這樣做有沒有負面影響?
以下代碼片段中Employee實例的生命期會發生什麼?實例在沒有分配給變量時的位置?
Department dept = new Employee(10).GetDepartment();
Employee類被創建並且未被賦值給任何變量。員工實例在這種情況下持續多久?
這樣做有沒有負面影響?
你可以認爲它是這樣的:
Employee __temp = new Employee(10);
Department dept = __temp.GetDepartment();
這是不是真的發生了什麼,但它有助於解釋發生了什麼有用的。
在這種情況下,__temp
是符合資格的到由垃圾收集儘快__temp.GetDepartment()
完成執行清理。它不會收集實際上,直到發生下一次垃圾回收循環,這會在運行時確定它是必要的時候發生。像
Department dept = new Employee(10).GetDepartment();
編寫代碼簡單地把你從自己申報的中間變量。編寫這樣的代碼沒有負面影響,這是非常普遍的做法。
1:有辦法手動強制收集週期,但99.9%的時間你不需要,不應該這樣做。
它將被垃圾收集爲任何其他物體。如果沒有引用該對象,則立即爲符合條件的。
注意GetDepartamet()
可以(也將在這種特殊情況下被怪)不斷提及「員工」:
Department GetDepartment()
{
return new Department { OnlyEmployee = this}
}
是否有任何負面影響:沒有,但每個人都會問,每次這個確切的問題閱讀代碼。
@fnostro是正確的,但沒有任何意義。 – CodeCaster
我刪除了我的評論,但你是對的,但OP想知道員工什麼時候會GC'd,答案真的是,'這取決於' – fnostro
這是一個誤導性的答案。它使得它聽起來像編譯器創建了一個臨時變量,該臨時變量會阻止收集「Employee」實例,直到臨時變量超出範圍,而不是立即符合條件。 – Enigmativity
+1。 @Enigmativity - 不,臨時變量的創建絕不會改變GC優化後最後一次使用後非優化構建/ JIT中全部方法的結束時間。 –
@Enigmativity我不認爲這與事實相去甚遠。編譯器在技術上並沒有創建一個變量,因爲不會使用'stloc'指令。但是,在調用'GetDepartment()'之前,對'Employee'的新實例的引用確實會被推入棧中,並且從某種意義上講,您可以將其視爲一個匿名變量。 –