제가 언제 ID 일회용을 구현해야 합니까?
ID 일회용 구현을 위한 가장 좋은 방법은 무엇입니까?
클래스에 하나의 관리 개체가 있는 경우 이를 구현하는 것이 가장 좋은 방법입니까? 아니면 이 개체가 클래스에 생성되었는지 아니면 전달되었는지에 따라 달라집니다.관리 객체가 전혀 없는 수업도 해야 하나요?
관리되지 않는 개체를 의미하는 경우, 클래스에서 처리 중인 관리되지 않는 리소스가 하나 이상 있을 때마다 이 개체를 구현해야 합니다.또한 ID 자체가 처분 가능한 개체를 보유하고 있을 때 패턴을 사용해야 하며 클래스가 처분될 때 해당 개체를 처분해야 합니다.
(작은 프린터를 인쇄할 경우 잉크가 부족해질 정도로 이 질문을 이미 충분히 많이 받았는지 확인합니다...)
모두가 (관리되지 않는) 리소스에 대해 언급했지만, 다음과 같은 추가 사항이 있습니다.클래스가 범위를 벗어나 가비지 수집되는 것을 방지하는 이벤트 핸들러 연결을 제거해야 할 때 사용합니다.
예를 들어, 하위 보기에 삽입되는 서비스가 있습니다. 하위 보기는 서비스에서 다양한 비동기 완료 유형 이벤트를 구독합니다.이 하위 뷰의 소유자는 구체적인 유형이 무엇인지 전혀 알지 못합니다. 단순히 인터페이스로 제공됩니다.서비스는 미래의 임의의 시점에서 범위를 벗어날 수 있으며, GC가 적용되지 않는 것을 원하지 않습니다.해당 하위 보기를 제거하면 소유자가 이벤트 핸들러를 해제할 수 있는 기회를 주기 위해 해당 하위 보기에 대해 삭제를 호출합니다.다음은 약간 조작된(그리고 매우 유사한) 코드의 예입니다. 하위 보기의 인터페이스가 어떻게 구현되는지 참고하십시오.IDisposable
.
public class OwnerView {
public OwnerView() {
_childView = new ChildView(myServiceReference);
}
public void CloseChildView() {
if (childView != null) {
_childView.Close();
_childView.Dispose();
}
_childView = null;
}
private IChildView _childView;
}
public class ChildView : IChildView {
public ChildView(MyService serviceRef) {
_serviceRef = serviceRef;
_serviceRef.GetSettingsAsyncFinished += new EventHandler(someEventHandler);
}
public void IDisposable.Dispose() {
_serviceRef -= someEventHandler;
}
private MyService _serviceRef;
}
public interface IChildView : IDisposable {
void DoSomething();
... etc ...
}
SO에 대한 다른 사람들의 이에 대한 훨씬 더 권위적인 의견이 있습니다. 예를 들어 이벤트 핸들러는 가비지 수집이 발생하는 것을 막습니까?이벤트 처리를 위해 익명 대리인을 사용하는 경우 및 가비지 수집.또한 이 코드 프로젝트 기사를 확인할 수도 있습니다.
제 생각에 문서들은 제가 일회용으로 사용하는 것이 무엇에 좋은지에 대해 꽤 명확한 것 같습니다.
이 인터페이스의 기본적인 용도는 관리되지 않는 리소스를 해제하는 것입니다.가비지 수집기는 관리 개체가 더 이상 사용되지 않으면 해당 개체에 할당된 메모리를 자동으로 해제합니다.그러나 가비지 수집이 언제 발생할지 예측할 수 없습니다.또한 가비지 수집기는 창 핸들이나 열린 파일 및 스트림과 같은 관리되지 않는 리소스에 대한 지식이 없습니다.
심지어 예시도 있습니다.에서 이예서구클스를 는 다음과 .IDisposable
핸들을 포함합니다.핸들을 더 이상 사용하지 않을 때는 해제해야 합니다.이 작업은 에서 수행됩니다.Dispose()
방법.따라서 해당 클래스의 사용자는 이 클래스를 사용하여IDisposable
클래스가 더 이상 필요하지 않을 때 클래스를 명시적으로 배치해야 한다는 것을 알고 있습니다(핸들을 해제할 수 있음).항상 호출해야 하는 모범 사례(즉, 규칙)입니다.Dispose()
IDisosable
인스턴스가 더 이상 필요하지 않은 인스턴스입니다.
클래스에 리소스를 모두 사용한 후 릴리스할 리소스가 있을 때 ID를 사용할 수 없도록 구현해야 합니다.
되지 않는 개체, 데이터베이스가 포함되어 있는 에는 클스에관않개, 스소리파있, 일또이스데는는경개베를 구현해야 .IDisposable
.
또한 폐기해야 하는 속성이 있는 경우.
언급URL : https://stackoverflow.com/questions/2431488/when-should-i-implement-idisposable
'programing' 카테고리의 다른 글
파일 변환:Android에서 파일에 대한 URI (0) | 2023.06.04 |
---|---|
인터페이스 - 요점이 무엇입니까? (0) | 2023.05.25 |
Node.js 오류: 'mongoose' 모듈을 찾을 수 없습니다. (0) | 2023.05.25 |
반환된 값이 null인 경우 postgresql이 0을 반환합니다. (0) | 2023.05.25 |
익스프레스 프레임워크를 사용하여 노드 J에서 쿠키를 설정하려면 어떻게 해야 합니까? (0) | 2023.05.25 |