Finalize와 Dispose의 분석
3056 단어 finalize
//System.Object
public class Object
{
...
protected virtual void Finalize() { }
}
사용자 정의 클래스에서 Finalize () 를 다시 쓸 때 쓰레기 수거기는 메모리에서 이 대상을 삭제하기 전에 대상의 Finalize () 방법을 호출할 수 있습니다.구조 유형은 Finalize()를 다시 쓸 수 없습니다.
이 구성원은 보호된 것으로 정의되어 있기 때문에 클래스 실례에서 대상의Finalize () 방법을 직접 호출할 수 없습니다.
실제로 대상에 표시되지 않는 Finalize () 호출 방법은 주로 쓰레기 수거기에서 자동으로 호출됩니다.
여기서 명확한 개념은 바로 Finalize()가 호출되는 시간이다.
Finalize () 호출은 '자연스러운' 쓰레기 회수 또는 프로그램이 GC를 통과하는 데 발생합니다.Collect () 를 강제로 회수하는 중입니다.
클래스의 분석 함수 (~를 접두사로 하고 구조 함수와 비슷해야 합니다. 그러나 접근 수식자를 받아들이지 않고, 파라미터를 받지 않으며, 다시 불러올 수도 없습니다.) 의 형식으로 다시 작성해야 합니다. 그렇지 않으면 컴파일 오류가 발생합니다.
다음은 종결의 구체적인 세부 사항을 설명한다.
트레이드 더미에 대상을 분배할 때, 라이브러리에서 자동으로 이 대상이 사용자 정의finalize () 방법을 제공하는지 확인합니다.만약 이렇다면, 대상은 끝낼 수 있는 것으로 표시되고, 동시에 이 대상을 가리키는 바늘은 이름으로 저장됩니다.
종료 대기열의 내부 대기열에 있습니다.종결 대기열은 쓰레기 수거기에서 삭제하기 전에 종결되어야 하는 모든 대상을 가리키는 표입니다.
쓰레기 수거기가 내부에서 대상을 방출할 시간이 확정되었을 때, 종결 대기열의 모든 항목을 검사하고, 대상을 더미에서 종결 도달표 (finalization reachable table) 라고 불리는 위탁 관리로 복사합니다.
구조상이 때 다음 쓰레기를 회수할 때, 도달표에 있는 모든 대상에게Finalize () 방법을 호출하는 또 다른 라인이 생성됩니다.
따라서 한 대상을 진정으로 종결시키기 위해서는 적어도 두 번의 쓰레기 수거가 필요하다.
요약:
Finalize () 는 스팸 수거기에서 자동으로 호출되기 때문에 호출할 때, 위탁 관리 대상이 존재하는지 확인할 수 없습니다. 즉, 다른 위탁 관리 대상과 통신하는 것은 안전하지 않습니다.그래서 위탁 관리 대상과 서로 교차할 수 없다.그리고
구체적인 시간은 우리도 알 길이 없다.
둘.폐기 가능 객체 구축
public interface IDisposable
{
void Dispose();
}
이 작용은 대상 사용자가 이 대상을 더 이상 사용하지 않을 때, 이 대상이 작용역을 인용하기 전에 디스패치 () 방법을 수동으로 호출할 것이라고 가정합니다.
이곳의 디스포지션 () 은 한 대상의 비위탁 관리 자원을 방출하는 것을 책임질 뿐만 아니라, 그 안에 포함된 처리 가능한 대상에 대해서도 디스포지션 () 을 호출해야 한다. 즉, 위탁 관리 자원을 방출하는 데도 사용할 수 있다.이 점은 Finalize()와 매우 다릅니다.
그것은 다른 위탁 관리 대상과 통신하는 것이 안전하다.이유는 간단하다. 쓰레기 수거기는 IDisposable 인터페이스를 지원하지 않고 Dispose ()를 영원히 호출하지 않는다.따라서 대상의 사용자가 이 방법을 호출할 때 대상은 여전히 위탁 관리 더미에 있다.
더미에 분배된 다른 모든 대상을 방문할 수 있습니다.
보충: using으로 Dispose () 방법을 호출할 수 있습니다.
마지막으로 한 대상의 정의에는 상기 두 가지 자원을 정리하는 기술이 포함될 수 있다.그러나 Dispose () 방법에 GC를 추가하는 것을 주의하십시오.SuppressFinalize(this).사용자가 Dispose ()를 호출하면 종료할 필요가 없기 때문에
따라서 종결을 뛰어넘을 수 있다.
마지막으로 마지막으로 다시 한 번 강조하겠습니다.
Finalize () 방법은 구체적인 호출 시간을 알 수 없습니다.그리고 위탁 관리 자원을 처리할 수 없다.
Dispose () 는 수동으로 호출되며 구체적인 방법을 알고 있습니다.이렇게 하면 그 긴급 자원을 즉각 방출하는 데 매우 유리하다.Finalize()보다 시간적으로 좋습니다.그리고 위탁 관리와 비위탁 관리 자원을 처리할 수 있다.
따라서 가능하면 디자인 클래스에서 Finalize () 방법을 제공하는 것을 피합니다. 시간이 많이 걸리기 때문입니다.가능한 한 Dispose()로 정리 문제를 해결합니다.