C#의 IDisposable 모드 사용법 상세 정보
우선, 쓰레기 수거에 있어 C#에서 위탁 관리 자원의 쓰레기 수거는 CLR의 Garbage Collection을 통해 이루어진다. Garbage Collection은 창고에 있는 대상의 분석 함수를 호출하여 대상의 방출 작업을 완성한다.일부 비위탁 관리 자원, 예를 들어 데이터베이스 링크 대상 등은 IDisposable 인터페이스에서 수동적인 쓰레기 회수를 실현해야 한다.그러면 Idisposable 인터페이스를 언제 사용하고 어떻게 사용합니까?
먼저 다음 코드를 참조하십시오.
public interface IDisposable
{
void Dispose();
}
public class DisposablClass : IDisposable
{
//
bool _disposed;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
~DisposableClass()
{
Dispose(false);
}
// IDisposable
protected virtual void Dispose(bool disposing)
{
if(_disposed) return; // ,
if(disposing)
{
//TODO: IDisposable
}
//TODO: , null
_disposed = true;
}
}
Dispose() 방법
관리되지 않는 리소스의 Disposable Class 클래스를 회수해야 할 경우 Dispoase () 방법을 사용합니다.이 방법은 CLR에서 자동으로 호출되지 않으며 수동으로 호출해야 합니다.
~DisposableClass(), 구문 분석 함수
트랜지스터 더미의 대상이 다른 대상에 인용되지 않으면 GC는 회수 대상에 앞서 대상의 분석 함수를 호출합니다.여기의 ~Disposable Class() 분석 함수는 GC에게 나를 회수할 수 있다는 것을 알려주는 데 의미가 있다. Dispose(false)는 GC를 회수할 때 수동으로 회수할 필요가 없다는 것을 의미한다.
가상 메소드 Dispose(bool disposing)
이 방법을 통해 모든 위탁 관리와 비위탁 관리 자원을 회수할 수 있다.매개 변수 disposing은 IDisposable 인터페이스를 실현하는 위탁 관리 대상을 방출해야 하는지 여부를 표시합니다.
disposings가true로 설정되면DisposablClass류는 IDisposable 인터페이스를 실현한 위탁 관리 대상에 의존하고 있으며, 이 위탁 관리 대상의Dispose(bool disposing) 방법을 통해 이 위탁 관리 대상의Dispose() 방법을 호출하여 회수할 수 있다.
만약disposings가false로 설정된다면DisposableClass류는 IDisposable를 실현하지 못한 일부 비위탁 자원 의존을 나타낸다. 그러면 이 비위탁 자원 대상을null로 설정하고 GC가DisposableClass류의 분석 함수를 호출하여 이 비위탁 자원 회수를 기다린다.
또한 Dispose(bool disposing) 방법을 보호된 virtual로 설정한 이유는 쓰레기 회수 논리의 디자인에 하위 클래스가 함께 참여할 수 있고 기본 클래스에도 영향을 주지 않기를 원하기 때문이다.예를 들어 다음과 같은 하위 클래스가 있습니다.
public class SubDisposableClass : DiposableClass
{
private bool _disposed; //
protected override void Dispose(bool disposing)
{
if(!_disposed) //
{
if(disposiing) //
{
//TODO: , IDisposable Dispose()
}
//TODO: , null, CLR
_disposed = true;
}
base.Dispose(disposing);//
}
}
에 있습니다.NET 2.0 이전에 한 대상의 분석 함수에서 이상을 던지면 이 이상은 CLR에서 무시됩니다.하지만..NET 2.0 이후 분석 함수가 이상을 던지면 응용 프로그램의 붕괴를 초래할 수 있다.따라서 분석 함수가 이상을 던지지 않도록 하는 것이 중요하다.
그리고 Dispose () 방법은 이상을 던질 수 있습니까?답안은 부정적이다.Dispose () 방법이 이상을 던질 가능성이 있으면try/catch를 사용하여 수동으로 포획해야 합니다.다음은 Dispose() 메서드에 예외가 있을 수 있음을 고려한 쓰기 방법입니다.
public class DisposableClass : IDisposable
{
bool _disposed;
......
protected virtual void Dispose(bool disposing)
{
if(_disposed) return;
if(disposing)
{
//TODO: Dispose()
}
try
{
_channelFactory.Close(); //
}
catch(Exception ex)
{
_log.Warn(ex);//
try
{
_channelFactory.Abort();//
}
catch(Exception cex)
{
_log.Warn(cex);//
}
}
_channelFactory = null;
_disposed = true;
}
}
총괄: 우리가 사용자 정의한 클래스와 업무 논리에서 일부 위탁 관리와 비 위탁 관리 자원을 인용할 때 IDisposable 인터페이스를 실현하고 이 자원 대상에 대한 쓰레기 회수를 실현해야 한다.
본고에서 기술한 바와 같이 여러분의 효율적인 C# 프로그램 설계에 도움이 되었으면 합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.