2009-03-08 3 views
4

어떻게하면 처리해야 할 때 알 수 있습니까? 누군가 내가 방금 처리해야 할 코드에 여러 객체가 있음을 언급합니다. 나는 아무 것도 처분 할 필요가 없다는 것을 몰랐다. (이것은 C#으로 첫 주간이다). 객체를 처리해야 할 때 어떻게 알 수 있습니까? 나는 http://msdn.microsoft.com/en-us/library/system.security.cryptography.hashalgorithm.aspx을 사용하고 있었고 페이지에 처분에 대한 언급이 없거나 다른 objs에서 언급 한 것을 보았습니다 (나는 누군가에 의해 처분되었다).개체를 처리해야 할 때 어떻게 알 수 있습니까?

내가 IDisposable을 상속 할 때 필요한 것은 알고 있지만 어떻게 상속합니까?

답변

4

IDisposable을 구현하는 것은 모두 폐기해야합니다. 그냥 다음을 사용하여 포장하십시오 :

using(var some = new Something()) 
    { 
    //use normally 
    } 
0

클래스가 IDisposable을 구현하는 경우 해당 클래스의 등급을 처리해야합니다. 그렇지 않으면 당신은하지 않습니다. 이 경우 HashAlgorithm은 IDisposable에서 파생되는 ICryptoTransform에서 파생됩니다. 즉, HashAlgorithm에서 내림차순으로 오는 모든 클래스 인스턴스를 처리해야합니다.

0

IDisposable 인터페이스를 구현하는 모든 개체는 삭제해야합니다.

public abstract class HashAlgorithm : ICryptoTransform, 
IDisposable 

관리되지 않는 리소스 (예 : DB 연결)가있는 것은 IDisposable 인터페이스를 구현해야합니다.

이 좋은 몇 가지 이유가 있습니다

  • 당신은 (일반적으로 매우 부족한) 관리되지 않는 리소스를 정리하려고하는 것을 알고있다. 대개 이것들은 finalizer에서 정리 될 것입니다. 그러나 GC가 finalizer가있는 객체를 정리하는 방법 때문에 시간이 걸릴 수 있습니다.
  • dispose pattern 표준을 구현하면 finalizer를 호출 할 필요가 없으므로 GC를 많이 저장하게됩니다. 여기
2

클래스는 IDisposable 인터페이스를 구현합니다. 즉, Dispose 메서드를 사용합니다.

IDisposable을 구현하는 모든 클래스가 Dispose으로 전화해야하지만 대부분은 그렇지 않습니다. 당신은 클래스가 IDisposable를 구현 (또는 기본 클래스에서 인터페이스를 상속하기 때문에 Dispose 방법이있다) 볼 경우, 당신은 두 choises 있습니다

  1. 파고 깊은 클래스가 IDisposable를 구현 왜 문서는 발견하기에 실제로 Dispose으로 전화해야하는 경우

  2. 그냥 Dispose으로 전화하십시오.

어느 방법이든 안전합니다. Dispose 메서드가 아무 것도하지 않으면 호출이 매우 빨라집니다. Dispose 번으로 전화를 걸어도 여러 번 해를 끼지 않고 한 번 이상 걸 수 있습니다. Dispose 방법은 자동으로 호출되는 블록의 끝 브래킷에서

using (FileStream s = File.OpenRead(path)) { 
    ... 
} 

:

단지 Dispose 메소드를 호출 한 후 더 나은는 using 블록을 사용하는 것입니다. using 블록은 try...finally으로 구현되므로 블록에서 예외가 발생하더라도 Dispose 메서드가 호출되도록 보장됩니다.

0

난 내가는 IDisposable 뭔가를 상속 때 필요 알고 있지만 그것을 상속 않을 때 어떻게 을 알 수 있습니까?

Visual Studio를 사용한다고 가정합니다. 일반적으로 유형을 마우스 오른쪽 버튼으로 클릭 한 다음 "정의로 이동"을 클릭하십시오. 그 클래스 나 그 슈퍼 클래스 중 하나가 IDisposable을 구현하면, Dispose를 호출해야합니다. 이것은 일반적으로 다른 사람이 언급 한대로 사용하는 블록에 배치하여 수행됩니다.

3

쉬운 방법은 obj.disp을 입력하고 intellisense에 dispose 메소드가 있는지 확인하는 것입니다.

+0

이 문제는 'obj'가 'IDisposable' [명시 적으로] (http://msdn.microsoft.com/en-us/library/ms173157.aspx)을 구현하는 유형 인 경우 intellisense가 위의 기법으로 어떤 방법도 찾지 못한다. 그런 다음 'IDisposable d = obj;'라고 입력하고 오류가 발생하는지 확인해야합니다. –

+0

@JeppeStigNielsen 새로 받아 들인 대답이 있습니까? –

+0

맞습니다. 'using (obj) {}'이 에러없이 빌드된다면, 컴파일 타임 타입의'obj'는'IDisposable'을 구현합니다. 그리고 그 경우에는'using '을 사용해야합니다. 대부분의 경우'using (var obj = someMethodCallOrNewObjectExpression()) {...} '과 같이 지역 변수 할당을'()'괄호에 넣는 것이 더 좋습니다. –

0

"마지막으로 방을 나간 사람이 조명을 끄시겠습니까?"

IDisposable을 구현하는 객체에는 "언젠가"발생해야하지만 객체가 아직 사용 중일 때 발생할 수없는 "정리"작업을 수행하는 데 필요한 정보와 자극이 있습니다. 객체가 완전히 버려지면 클린업 작업이 수행되지 않습니다. 이 시스템에는 개체가 생성 될 때 등록 할 수있는 관리자 (custodian)가 포함됩니다. 관리자가 아닌 모든 사람이 특정 대상을 포기한 경우 관리자는 해당 관리자에게 해당 정리 작업을 수행하도록 요청할 수 있습니다. 다양한 이유로 수탁자는 버려진 물건을 처리 할 때 100 % 효과적이지 않습니다. 따라서 가능할 때마다 참조를 포기하기 전에 개체에 대한 유용한 참조를 보유하는 마지막 엔터티가이를 처분하는 것이 매우 바람직합니다.

관련 문제