2014-03-27 2 views

답변

2

는 :

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

이 일어나고 있지만 무슨 일이 일어나고 있는지 설명 할 수 유용 무엇을 정말하지 않습니다. 이 경우

__tempelegible가 빨리 __temp.GetDepartment() 같은 마무리가 실행 가비지 컬렉터에 의해 세정 될 것이다. 실제로는이 다음 가비지 수집주기가 발생할 때까지 수집되지 않으며 런타임에서 필요하다고 판단 될 때 발생합니다.

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

같은 1

작성 코드는 단순히 중간 변수를 직접 선언 할 필요가 당신을 절약 할 수 있습니다. 이와 같은 코드 작성의 부작용은 없으며 매우 일반적인 습관입니다.

1 : 수동으로 수집주기를 강제하는 방법이 있지만 그럴 필요가없고하지 말아야하는 시간의 99.9 %입니다.

+0

이것은 오해의 소지가있는 대답입니다. 컴파일러가 임시 변수를 생성하여 임시 변수가 즉시 자격이있는 것이 아니라 범위를 벗어날 때까지'Employee' 인스턴스를 수집하지 못하도록하는 것처럼 들립니다. – Enigmativity

+0

+1. @Enigmativity - 아니요. 임시 변수를 만들면 최적화 된 빌드/JIT에서 전체 메소드의 끝, 최적화 된 마지막 사용 직후에 GC의 적합성이 변경되지 않습니다. –

+0

@Enigmativity 나는 그것이 진실과는 거리가 멀다고 생각하지 않는다. 컴파일러는 stloc 명령어가 사용되지 않기 때문에 기술적으로 변수를 생성하지 않습니다. 그러나'Employee'의 새로운 인스턴스에 대한 참조는'GetDepartment()'를 호출하기 전에 스택으로 푸시됩니다. 그리고 어떤 의미에서는 이것을 익명의 변수로 생각할 수 있습니다. –

2

다른 개체와 마찬가지로 가비지 수집됩니다. 해당 객체에 대한 참조가없는 경우 이 적합하며 즉시 GC의 경우이됩니다. GetDepartamet()가 (이 특별한 경우에 이상한 것) 수

주에 "직원"참조를 유지 :

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

어떤 부정적인 영향이 있습니까 : 아니, 모든 사람이 정확한 질문마다 요구됩니다 제외 코드를 읽는 중. 당신은 그것을 이런 식으로 생각할 수

+0

@fnostro 정확하지만 그렇게하는 것은 의미가 없습니다. – CodeCaster

+0

제 의견을 삭제했지만 당신 말이 맞았습니다.하지만 OP는 언제 직원이 GC가 될지 알고 싶었습니다. 대답은 '그것이 다릅니다'입니다. – fnostro

관련 문제