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.