2013-06-13 3 views
3

제목은이 질문을 아주 명확하게 설명합니다. 왜 내가 다른 클래스에서 명시 적으로 dispose() 메서드를 정의하고 관리되지 않는 모든 리소스를 해제 할 수있는 클래스에서 단 하나의 메서드 정의를 제공하는 IDisposable 인터페이스를 구현할 것인지 알고 싶습니다. dispose() 메서드를 클래스에 쓸 수있는 경우 IDisposable을 사용하는 이유

내가이 두 클래스

정확히 MyClass에와 MyClass2의 차이점은 무엇입니까
class MyClass : IDisposable 
{ 
    public void Dispose() { } 
} 

class MyClass2 
{ 
    public void Dispose() { } 
} 

을 말해봐?

+0

일반적으로 프로그래밍 연습을 의미합니까[email protected] –

+0

인터페이스를 사용하여 필요할 때 전화를 걸 수있는 Dispose 메서드가 있음을 .Net에 알립니다. – Serge

답변

10

매우 구체적인 결과는, 첫 번째 클래스는 using() {} 문에서 사용할 수 있으며, 두 번째는 할 수 없다는 것입니다 :

using (var c1 = new MyClass()) { ... } // Ok 
using (var c2 = new MyClass2()) { ... } // Error 

더 일반적인 대답은 인터페이스가 제공한다는 것입니다 대체를 허용하는 계약. 자세한 정보는 '인터페이스의 이점'또는 그와 유사한 것을 찾아보십시오. 예를 들어 this SO answer에 목록이 있습니다.

치환의 예는

:

public interface IRepository { ... } 

public class RealRepository : IRepository { ... } 
public class MockRepository : IRepository { ... } 

class MyController { public IRepository { get; set; } 

이 (스케치) 단편 모의 저장소와 실제 (DB) 저장소로 사용하고 테스트 할 수있는 제어기를 나타낸다.

+0

"대체 허용"이란 무엇을 의미합니까? 모범 사례를 줄 수 있니? –

+2

예제를 추가했지만 SO 문항은 기본 자습서를 얻을 수있는 적절한 곳이 아닙니다. 이 [google 결과] (https://www.google.nl/search?q=c%23+tutorial+interface&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox)를 참조하십시오. -에이). 내 포인트는 무엇입니까 –

3

IDisposable은 리소스를 해제하기위한 일반적인 의미의 범용 계약의 일부를 정의하기 때문에. 특정 패턴을 나타내는 관련 메서드를 노출하기 위해 의존 할 수있는 알려진 패턴입니다 (Henk은 using이라는 언어로 이에 대한 구체적인 예를 제공합니다). 코드의 즉각적인 사용자 만이 클래스의 Dispose 메소드가 있다는 것을 알고 있습니다.

첫 번째 인스턴스에서 클래스는 계약을 구현하며 일반적인 방법으로 사용할 수 있습니다. IDisposable 특정이 예에서는

+0

조금 더 멀리 eleborate 할 수 있습니까? 나는 인터페이스가 무엇인지 알고 있지만 정확히 차이점은 무엇입니까? –

+0

하지만 직접적인 사용자는 클래스 정의를보고 클래스 Dispose 메서드의 존재를 알 수 있습니다. 그렇다면 어떤 차이가 있습니까? –

+0

@AtharAnis 내 아이디어는 클래스를 사용하는 책임감있는 타사 개발자가 IDisposable이라는 사실을 인식하고 완료되면 'Dispose'메서드를 호출한다는 것입니다. 편집 : 그것은 너무 많이 그것은'IDisposable'만큼'Dispose' 방법을 가지고 아니에요. 그것이 인터페이스를 상속받지 않는다면,'Dispose' 메쏘드는 아무 것도 의미 할 수 없습니다. 결론적으로 .NET 개발자는 일반적으로 'IDisposable'클래스로 작업하는 원칙을 이해하고 준수합니다. –

0

두 가지의 차이는 Class1 공식적으로이 인터페이스를 구현한다는 것입니다.

Class2는 위의 조건이 좋지 않지만 잠재적으로이를 구현합니다. 메소드의 구현/존재는 둘 다 동일 할 수 있습니다.

+0

thats! 왜 IDisposable을 사용합니까? Offcourse, Microsoft는 어떤 이유로 그것을 개발 했어야합니다. –

+0

클래스가 한 곳에서만 사용되는 경우, 클래스를 사용하는 클래스가 유일하며 변경되지 않습니다. IDisposable을 건너 뛸 수 있습니다. –

1

IDisposable은 단 하나의 인터페이스이지만 "간단하게 메소드를 구현할 수있을 때 인터페이스를 구현해야하는 이유는 무엇입니까?"라는 질문을 일반화 할 수 있습니다. 여기에 몇 가지 빛을 비춰 줄 수있는 또 다른 예가 있습니다 : 을 사용하면 클래스가입니다.

interface IAnimal 
{ 
    void PutInZoo(Zoo); 
} 

class Cat: IAnimal 
{ 
    public void PutInZoo(Zoo theZoo); 
} 

class Fish 
{ 
    public void PutInZoo(Zoo theZoo); 
} 

class Zoo 
{ 
    public void PutInZoo(IAnimal animal) 
    { 
     animal.PutInZoo(this); 
    } 

    public Zoo() 
    { 
     this.PutInZoo(new Cat()); // Ok 
     this.PutInZoo(new Fish()); // Nope, Fish doesn't implement IAnimal 
    } 
} 

컴파일 오류 제외하고, 인터페이스를 구현하는 가장 눈에 띄는 부작용이며, 당신이 그것을 준수해야인터페이스 경우 변경됩니다. IAnimal는 정의가 변경되고 PutInZooFreeFromZoo로 이름이 변경되는 경우이 예에서

, Fish는 여전히 컴파일 것이다 (그리고 아마도 그 소비자를 깰)하지만 Dog은하지 않습니다 : 더 이상 IAnimal을 구현합니다.

관련 문제