C #에서 함수 이름 앞의 물결표는 무엇을 의미합니까?


164

몇 가지 코드를보고 있으며 다음과 같은 진술이 있습니다.

~ConnectionManager()
{
    Dispose(false);
}

클래스는 IDisposable인터페이스를 구현 하지만 물결표 (~)가 사용되는지 여부는 알 수 없습니다.

답변:


213

~는 소멸자입니다

  1. 소멸자는 자동으로 호출되며 명시 적으로 호출 할 수 없습니다.
  2. 소멸자는 오버로드 할 수 없습니다. 따라서 클래스는 최대 하나의 소멸자를 가질 수 있습니다.
  3. 소멸자는 상속되지 않습니다. 따라서 클래스에는 선언 된 클래스 이외의 소멸자가 없습니다.
  4. 소멸자는 구조체와 함께 사용할 수 없습니다. 클래스에만 사용됩니다. 더 이상 코드를 사용할 수없는 인스턴스는 소멸 될 수 있습니다.
  5. 인스턴스의 소멸자 실행은 인스턴스가 소멸 될 수있는 시점 이후 언제라도 발생할 수 있습니다.
  6. 인스턴스가 소멸되면 상속 체인의 소멸자가 가장 많이 파생 된 것부터 가장 덜 파생 된 것까지 순서대로 호출됩니다.

마무리

C #에서 Finalize 메서드는 표준 C ++ 소멸자가 수행하는 작업을 수행합니다. C #에서는 이름을 Finalize로 지정하지 않습니다. 클래스 이름 앞에 물결표 (~) 기호를 배치하는 C ++ 소멸자 구문을 사용합니다.

처분

클래스의 사용자가 명시 적으로 호출 할 수 있는 Close()또는 Dispose()메서드 에 객체를 처리하는 것이 좋습니다 . GC는 최종화 (소멸자)를 호출합니다.

는 IDisposable 인터페이스는 클래스가 배치 될 필요 자원을 점유하고 사용자에게이를 해제 할 수있는 방법을 제공하는 세계를 알려줍니다. 클래스에서 종료자를 구현해야하는 경우 Dispose 메소드 GC.SuppressFinalize()메소드를 사용 하여 인스턴스의 종료가 억제되도록해야합니다.

무엇을 사용해야합니까?

소멸자를 명시 적으로 호출하는 것은 합법적이지 않습니다. 가비지 수집기에서 소멸자를 호출합니다. 닫고 처리하려는 귀중한 관리되지 않는 리소스 (예 : 파일 핸들)를 가능한 한 빨리 처리하려면 IDisposable 인터페이스를 구현해야합니다.


3
과거에는 어땠는지 모르겠습니다. 그러나 이제 소멸자가 상속되었습니다. 자세한 내용은이 링크를 확인하십시오 (끝의 예를 확인하십시오). msdn.microsoft.com/en-us/library/66x5fx1b.aspx
RononDex

1
귀하가 링크 한 바로 그 페이지의 @RononDex 포인트 3은 "Finalizers 상속 될 수 없음" 상태 이므로 귀하의 의견과 모순됩니다. 그것은 틀림없이 전부가 상속 될 수는 없지만, 때문에 혼란 약간 의 " Finalize방법은 최소 파생 된 대부분의 파생에서 상속 체인의 모든 인스턴스에 대한 재귀라고합니다" . 그러나 상속 가능한 소멸자에서 얻는 것과 동일한 동작 은 아닙니다 .
Mark Amery

@ MarkAmery 아 아, 기본적으로 그들은 상속 된 것과 비교하여 역순으로 호출됩니까?
RononDex

45

이것은 파이널 라이저 입니다. 솔직히 말해서 파이널 라이저를 작성할 필요는 거의 없습니다. 다음과 같은 경우 실제로 하나만 작성하면됩니다.

  • 관리되지 않는 리소스 (예 :)를 통해 직접 액세스 IntPtr할 수 SafeHandle있으며 더 쉽게 사용할 수 없습니다.
  • IDisposable봉인되지 않은 클래스에서 구현 하고 있습니다. (내가 선호하는 것은 클래스가 상속 용으로 설계되지 않은 한 클래스를 봉인하는 것입니다.) 이러한 경우 종료자는 정규 Dispose 패턴의 일부입니다.

9

클래스의 소멸자를 표시하는 데 사용됩니다.


12
읽는 C # 사양에 따라 둘 다 정확합니다. 가장 최근의 MS (통합 C # 3.0)는 이들을 소멸자 (예 : 섹션 10.13)라고하지만 ECMA 사양은이를 최종 자라고합니다.
Jon Skeet

@ 1800 정보 : 구문 요소를 소멸 자라고 합니다. 클래스에 소멸자가있는 경우 C # 컴파일러는 try/finally부모 Finalize메서드가 호출 되도록 하는 일반적으로 쓸모없는 블록을 포함하는 종료자를 자동 생성합니다 . 소멸자에 해당되는 대부분의 내용은 종료 자에 해당되며 그 반대의 경우도 있지만 단어의 의미는 약간 다릅니다.
supercat

4

C ++과 마찬가지로 소멸자입니다. 그러나 C #에서는 명시 적으로 호출하지 않고 객체가 수집 될 때 호출됩니다.



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.