몇 가지 코드를보고 있으며 다음과 같은 진술이 있습니다.
~ConnectionManager()
{
Dispose(false);
}
클래스는 IDisposable
인터페이스를 구현 하지만 물결표 (~)가 사용되는지 여부는 알 수 없습니다.
답변
~는 소멸자입니다
- 소멸자는 자동으로 호출되며 명시 적으로 호출 할 수 없습니다.
- 소멸자는 오버로드 할 수 없습니다. 따라서 클래스는 최대 하나의 소멸자를 가질 수 있습니다.
- 소멸자는 상속되지 않습니다. 따라서 클래스에는 선언 된 클래스 이외의 소멸자가 없습니다.
- 소멸자는 구조체와 함께 사용할 수 없습니다. 클래스에만 사용됩니다. 더 이상 코드를 사용할 수없는 인스턴스는 소멸 될 수 있습니다.
- 인스턴스의 소멸자 실행은 인스턴스가 소멸 될 수있는 시점 이후 언제라도 발생할 수 있습니다.
- 인스턴스가 소멸되면 상속 체인의 소멸자가 가장 많이 파생 된 것부터 가장 덜 파생 된 것까지 순서대로 호출됩니다.
마무리
C #에서 Finalize 메서드는 표준 C ++ 소멸자가 수행하는 작업을 수행합니다. C #에서는 이름을 Finalize로 지정하지 않습니다. 클래스 이름 앞에 물결표 (~) 기호를 배치하는 C ++ 소멸자 구문을 사용합니다.
처분
클래스의 사용자가 명시 적으로 호출 할 수 있는 Close()
또는 Dispose()
메서드 에 객체를 처리하는 것이 좋습니다 . GC는 최종화 (소멸자)를 호출합니다.
는 IDisposable 인터페이스는 클래스가 배치 될 필요 자원을 점유하고 사용자에게이를 해제 할 수있는 방법을 제공하는 세계를 알려줍니다. 클래스에서 종료자를 구현해야하는 경우 Dispose 메소드 는 이 GC.SuppressFinalize()
메소드를 사용 하여 인스턴스의 종료가 억제되도록해야합니다.
무엇을 사용해야합니까?
소멸자를 명시 적으로 호출하는 것은 합법적이지 않습니다. 가비지 수집기에서 소멸자를 호출합니다. 닫고 처리하려는 귀중한 관리되지 않는 리소스 (예 : 파일 핸들)를 가능한 한 빨리 처리하려면 IDisposable 인터페이스를 구현해야합니다.
답변
이것은 파이널 라이저 입니다. 솔직히 말해서 파이널 라이저를 작성할 필요는 거의 없습니다. 다음과 같은 경우 실제로 하나만 작성하면됩니다.
- 관리되지 않는 리소스 (예 :)를 통해 직접 액세스
IntPtr
할 수SafeHandle
있으며 더 쉽게 사용할 수 없습니다. IDisposable
봉인되지 않은 클래스에서 구현 하고 있습니다. (내가 선호하는 것은 클래스가 상속 용으로 설계되지 않은 한 클래스를 봉인하는 것입니다.) 이러한 경우 종료자는 정규 Dispose 패턴의 일부입니다.
답변
클래스의 소멸자를 표시하는 데 사용됩니다.
답변
C ++과 마찬가지로 소멸자입니다. 그러나 C #에서는 명시 적으로 호출하지 않고 객체가 수집 될 때 호출됩니다.