C#의 소멸자에 대한 기사를 읽었으나 괜찮은 유스 케이스를 찾는 데 어려움을 겪고 있습니다.C# 소멸자의 샘플 사용
누군가가 설명과 함께 사용 예를 제공 할 수 있습니까?
많이 감사합니다.
업데이트
책의 코드 예제는 Desctuctor과 폐기() 메소드 모두,이 책에서이 코드를 참조 구현합니다. 마르코
C#의 소멸자에 대한 기사를 읽었으나 괜찮은 유스 케이스를 찾는 데 어려움을 겪고 있습니다.C# 소멸자의 샘플 사용
누군가가 설명과 함께 사용 예를 제공 할 수 있습니까?
많이 감사합니다.
업데이트
책의 코드 예제는 Desctuctor과 폐기() 메소드 모두,이 책에서이 코드를 참조 구현합니다. 마르코
종결자는 매우 희박합니다.은 거의 필요하지 않습니다. 그들은 으로 기본 리소스에 직접 액세스 할 때을 사용해야했지만 이제는 보통 SafeHandle
을 사용해야합니다. 는 C# 사양의 ECMA 버전 그들에게 말한다 : 읽어 :)
용어에 대한 빠른 노트 그렇게 가서 -
조 더피는 나 자신을 쓸 수있는 것보다 오히려 더 자세한 사항에 어울릴 excellent post about this있다 finalizers로; 마이크로 소프트 버전의 스펙은 항상 소멸자로 언급하고 계속 그렇게하고 있습니다.
어디 계십니까? 기차에서? = P 메타에 게시 된 일정을 읽었습니다. 나는 당신이 당신의 스케줄을위한 upvotes를 얻고있는 동안 많이 웃었다! Hehehe ... 아니, 나는 타임 존을 고려해야한다. 그래서 집에 있어야하고, TV를 보지 않아야한다. = P 어쨌든! 좋은 밤 보내! =) –
@Will : 게시 및 재생 PixelJunk Monsters 사이의 번갈아 :) –
얼마나 훌륭한 기사 - 감사합니다! 다행히 SafeHandle 구현 덕분에 사용할 필요가 거의 없습니다. – Marko
class MyClass
{
bool disposed = false; // Disposal status
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
~MyClass()
{
Dispose(false);
}
protected virtual void Dispose(bool disposing)
{
if (disposed == false)
{
if (disposing == true)
{
// Dispose the managed resources. Factored Dispose
}
// Dispose the unmanaged resources.
}
disposed = true;
}
}
그들은 파이 나라, 아니 소멸자이야. 종종 관리되지 않는 리소스를 정리하는 데 사용됩니다. 직접 파일 클래스를 작성한 경우 파이널 라이저를 사용하여 원시 파일 핸들을 정리해야합니다.
IDisposable
인터페이스는 소멸자/finalzer로 사용할 수있는 방법을 제공합니다.
내 말은 객체가 사용하는 리소스를 해제하려면 IDisposable
인터페이스를 구현할 수 있다는 것입니다. 다른 사람들이 말했듯이 이것은 Dispose()
메서드가 직접 호출되지 않기 때문에 좋은 오래된 소멸자와 같은 것이 아니라 잠시 후 개체를 처리하는 관리 코드에 의해 수행됩니다.
나는 downvotes와 괜찮지 만, 오류가 있다면 내 오류에서 배울 수 있도록 적어도 틀린 말을해라! Mark Byers는 'IDisposable'인터페이스 사용을 제안합니다. –
아니, 그들은 매우 다릅니다. 'Dispose'는 다른 코드에 의해 * 명시 적으로 호출됩니다. 반면 destructors/finalizer는 가비지 컬렉터에 의해 비 결정 론적으로 호출됩니다. –
안녕하세요 : +1! 너 먼저 거기있어. – n8wrl
Finalizer는 C#에서는 거의 필요하지 않으며 가비지 수집기를 추가하면 가비지 수집기가 최종본을 실행하는 데 추가 패스가 필요하므로 가비지를 정리하는 데 오래 걸릴 수 있습니다. 대신 일반적으로 IDisposable 패턴을 사용해야합니다.
finalizer의 사용 예는 자원 유출이 의심되는 경우 디버깅 할 때 객체를 가비지 수집하기 전에 Dispose
이 올바르게 호출되었는지 검사 할 수 있습니다. 관리되지 않는 리소스를 보유하고있는 객체에 Dispose가 호출되기 전에 호출 된 finalizer가 있으면 리소스 누수의 징후 일 수 있습니다. 그러나 finalizer가 호출되지 않을 수도 있기 때문에 응용 프로그램에 중요한 논리가 포함되어서는 안됩니다.
내가 읽는 책의 코드는 흥미롭게도 Dispose와 Destructor (실제로 Dispose (false)를 호출 함)를 구현합니다. – Marko
@ Marko 그 패턴은 .net 2.0에서'SafeHandle's가 소개되기 전에 일반적이었습니다.지금은 사용되지 않습니다. – CodesInChaos
두 분 덕분에 책의 샘플 코드를 참조로 추가했습니다. – Marko
무엇이 destructor
입니까? C#을 더 이상 필요하지 않을 때 핸들을 닫습니다 결정적 파괴
유용한 사용할 것
using
문과 함께 사용됩니다.Dispose()
을 생각하는 것을 선호한다. 네이티브 자원사용
SafeHandle
s 내가 대신 개인하여 SafeHandle을 소유하고 그것을 자신의 폐기에 Dispose
메소드의 호출해야합니다 현대적인 코드를 게시 한 패턴의 생각합니다.C#에는 '파괴자'가 없습니다. .NET의 가비지 수집기를 사용하면 클래스가 범위를 벗어날 때 곧바로 개체 컬렉션이 생성되지 않습니다.
나는 당신이 더 관심있는 것이 IDisposable 패턴이라고 생각합니다. 이는 객체가 사용하는 리소스를 정리할 수있는 결정적인 방법입니다.
또한 .NET 클래스에는 개체를 수집 할 때 실행되는 'finalizer'가있을 수 있습니다. 객체의 원래 호출자가 무시한 경우 처 리를 호출하는 데 사용할 수 있습니다.
그러나 클래스에 finalizer를 구현하면 GC를위한 특수 처리를 위해 대기열에 대기하게되고 성능에 영향을 미칠 수 있습니다.
http://www.devx.com/dotnet/Article/33167/0/page/2 꽤 좋은 기사 ... –