programing

제가 언제 ID 일회용을 구현해야 합니까?

showcode 2023. 5. 25. 22:15
반응형

제가 언제 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

반응형