2014-01-23 3 views
3

나는 클래스처럼이 : 내가 하나의 인스턴스 만이 필요하고 인스턴스를주지 않고 다른 모든 클래스에서 기능을 액세스 할 수 있기 때문에C# 클래스를 정적으로 만드시겠습니까?

class ContentManager : IDisposable 
{ 
    List<int> idlist = new List<int>(); 

    public int Load(string path) 
    { 
     //Load file, give content, gets an id 

     //... 

     int id = LoadFile(myfilecontent); 

     idlist.Add(id); 
     return id; 
    } 

    public void Dispose() 
    { 
     //Delete the given content by id, stored in idlist 

     foreach(int id in idlist) 
     { 
      DeleteContent(id); 
     } 
    } 
} 

나는,이 정적 만들고 싶어.

나는 모든 변수를 정적으로 만들고 함수를 정적으로 만들 수 있습니다.

하지만 내 문제는 IDisposable입니다. 정적 클래스에서는 인터페이스를 사용할 수 없습니다. 결국 어떻게해야할까요? 나는 그 인터페이스를 제거 할 수 있지만 그 안에 함수를 남겨두고 내 메인 클래스를 사용하면 ContentManager.Dispose()를 호출 할 때 메인 클래스가 삭제됩니다. 하지만 내 메인에서 그걸 잊었을 때 ...

당신은 그것에 대한 좋은 해결책이 있습니까? 프로그램이 닫힐 때마다 Dispose가 호출되는지 확인하십시오.

편집 : 그래픽 카드에 데이터를로드하고 포인터를 다시 가져옵니다. 내 응용 프로그램이 닫히면 그래픽 카드에서 내용을 삭제해야합니다. 안전을 위해 모든 것이 삭제되고 처분됩니다.

+0

http://stackoverflow.com/questions/12126598/how-and-when-are-c-sharp-static-members-disposed – Habib

+0

싱글 톤을 찾는 것처럼 보입니다. http : //en.wikipedia. org/wiki/Singleton_pattern –

답변

2

을 : 나는 당신이 싱글로를 사용하는 방법의 예를 추가? 정적 종결 자 및 소멸자는 불가능합니다. AppDomain이 종료 될 때 유형이 언로드되기 때문에 어쨌든 IDisposable을 사용할 수 있다는 사실은 유용하지 않습니다.

IDisposable을 실제로 구현해야하고 클래스 인스턴스를 하나만 갖고 싶다면 아마도 Singleton 패턴을 사용하는 것이 더 나은 솔루션일까요?

클래스는 다음과 같이 수 :

class ContentManager : IDisposable 
{ 
     List<int> idlist = new List<int>(); 

     static ContentManager instance=null; 

     ContentManager() 
     { 
     } 

     public static ContentManager Instance 
     { 
      get 
      { 
       if (instance==null) 
       { 
        instance = new ContentManager(); 
       } 
       return instance; 
      } 
     } 

     public int Load(string path) 
     { 
      //Load file, give content, gets an id 

      //... 

      int id = LoadFile(myfilecontent); 

      idlist.Add(id); 
      return id; 
     } 

     public void Dispose() 
     { 
      //Delete the given content by id, stored in idlist 

      foreach (int id in idlist) 
      { 
       DeleteContent(id); 
      } 
     } 
} 

그것은 스레드로부터 안전하지 않습니다하지만 당신의 시나리오에서 충분히있을 수 있습니다.

7

나는 클래스를 비 정적 클래스로 남겨두고 싱글 톤 패턴을 구현할 것이다. 이 경우에는 IDisposable 인터페이스를 필요합니까 왜

public class ContentManager : IDisposable 
{ 
    private List<int> idlist = new List<int>(); 
    private static ContentManager instance; 

    private ContentManager() {} 

    public static ContentManager Instance 
    { 
     get 
     { 
      if (instance == null) 
      { 
       instance = new ContentManager(); 
      } 
      return instance; 
     } 
    } 

    public int Load(string path) 
    { 
     int id = LoadFile(myfilecontent);  
     idlist.Add(id); 
     return id; 
    } 

    public void Dispose() 
    { 
     foreach(int id in idlist) 
     { 
      DeleteContent(id); 
     } 
    } 
} 
3

IDisposable을 구현하면 안됩니다. 문제는, 인터페이스 목적은 인스턴스가 범위를 벗어날 때 정리가 수행되도록하는 것입니다. 인스턴스가 없기 때문에 IDisposable이 실제로 적용되지 않습니다.

IDisposable의 주된 기능은 using 문에 인스턴스를 할당하면 해당 호출이 컴파일러에 의해 추가된다는 것입니다. 다시 말하지만, 더 이상 인스턴스가 없으므로 아무런 목적이 없습니다. 대신 자신의 처분/정리 방법을 사용하고 그 목적을 문서화해야합니다. 너무 오류가 발생하기 쉬운 것 같으면 (문서에 의존하는 것이 컴파일러/런타임을 강화하는 것보다 덜 바람직 함), 아마도 다른 답변에서 제안 된 것처럼 싱글 톤 패턴을 따르기를 원할 것입니다.

1

수업을 싱글 톤으로 전환하십시오.

관련 문제