2013-04-28 2 views
3

는 전 클래스가이 클래스는 "값"변수는 파일에서 읽는 빅 데이터가 포함되어 있습니다C# 목록에서 사용 후 개체를 삭제 하시겠습니까?

public class MyClass : IDisposable 
{ 
    public string name {get; set;} 
    public string value {get; set;} //I'm load huge data for this variable 

    public MyClass(string name, string value) 
    { 
     this.name = name; 
     this.value = value; 
    } 

    public void Execute() 
    { 
     Console.WriteLine(this.name + ":" + this.value); 
    } 

    public void Dispose() 
    { 
     Dispose(true);    
     GC.SuppressFinalize(this); 
    } 

    protected virtual void Dispose(bool disposing) 
    {      
     if (disposing) 
     { 
      this.name = null; 
      this.value = null; 
     }      
    } 
} 

을 그리고 난 그것이 전역 변수

List<MyClass> listQ = new List<MyClass>() { new MyClass("1", "BIGDATA1"), 
      new MyClass("2", "BIGDATA2"), 
      new MyClass("3", "BIGDATA3"), 
      new MyClass("4", "BIGDATA4"), 
      new MyClass("5", "BIGDATA5"), 
      new MyClass("6", "BIGDATA6"), 
     }; 

    private void FUC_Load(object sender, EventArgs e) 
    {       
     foreach (MyClass m in listQ) 
     { 
      m.Execute(); 
      m.Dispose(); 
     }      
    } 

그래서 목록에서이 클래스를 사용하고 있습니다 내가 그걸 좋아한다면 어떤 문제가 있을지 물어보고 싶니? 내 물건이 처분 될 것인가? 가장 좋은 방법이 있습니까? 감사!

+0

클래스에 'IDisposable'이 필요하지 않습니다. –

+1

또한 이름과 값 멤버 모두를 문자열로 유지하는 경우 휠을 다시 작성하는 대신 NameValueCollection에서 더 잘 상속받을 수 있습니다. – dotNET

답변

8

부적절한 사용은 Dispose()입니다.

Dispose()은 두 가지 경우에 사용하기위한 것입니다 :

  1. 당신이 관리되지 않는 리소스를 폐기하는 경우.
  2. 자체가 IDisposable을 구현하는 유형의 객체를 삭제할 때.

당신은 더 나은 무슨 일이 일어나고 있는지 설명하는 Clear() 같은 것을 할 당신의 Dispose() 방법을 바꾸어야합니다.

또는 귀하의 경우에는 아마도 listQ 참조를 null 번으로 설정하면됩니다. 데이터를 반복하면서 데이터가 파괴되므로 데이터가 필요 없다는 것은 분명합니다.

listQ 참조를 null로 설정하면 참조가 보유한 모든 객체의 참조를 포함하여 모든 메모리가 해당 객체에 대한 참조를 보유하고 있지 않다는 가정하에 (결국) 가비지 수집됩니다.

모두listQ에 대한 참조가 null로 설정되어 있는지 확인해야합니다. (스택에 대한 참조는 해당 메소드가 반환 될 때 자동으로 사라 지므로 그에 대해 걱정할 필요가 없습니다.)

+2

고맙습니다. 너는 내 목숨을 구하고있다. –

1

여러분은 여러분의 메모리를 차지하는 객체에 대해 정말로 염려하고 있습니다. 네트워크 또는 원격 DB 리소스에 액세스하는 것과 같이 관리되지 않는 리소스를 사용하지 않는 한 그러지 마십시오. 귀하의 경우가 아니기 때문에 런타임은 리소스가 필요하다고 판단 될 때 리소스를 확보 할만큼 지능적입니다.

. NET 런타임의 가비지 수집은 관리되는 리소스를 관리하므로 관리되는 핸들을 확보하는 데 너무 많은 걱정을해서는 안됩니다.

목록 참조가 범위를 벗어나거나 GC에서이 목록이 사용되지 않는다는 것을 알고 있으면 개체가 메모리에서 지워집니다.

-1

IDisposable 인터페이스는 결정 론적 마무리 작업을위한 것입니다.

관리되지 않는 리소스를 해제하는 방법으로 시작되었지만 요즘은 관리되는 개체를 마무리하는 데 자주 사용됩니다.

마무리는 개체를 해제하는 것을 의미하지 않습니다. 더 이상 물체를 사용하지 않으려는 의도가 드러난 것입니다.

개체가 열기/닫기를 지원하는 경우 두 번 이상 열거 나 닫을 수 있음을 의미합니다.이 경우 Dispose는 Close를 호출해야하지만 같은 객체를 사용하면 더 이상 사용할 수 없습니다.

IDisposable의 많은 구현에는 개체가 삭제 된 경우 제어 할 추가 논리와 개체가 삭제 된 경우의 이벤트가 있습니다. 이 이벤트는 추가 된 콜렉션에서 오브젝트를 제거하는 데 종종 사용됩니다.

개체 자체가 가비지 수집기가 회수 할 때만 중단됩니다.

1

가능하면 List 대신 Queue 클래스를 사용하십시오. 이렇게하면 Dequeue 할 때 컬렉션에서 객체를 자동으로 제거합니다.

while(queueCollection.Count > 0) { 
    MyClass obj = queueCollection.Dequeue(); 
    obj.Execute(); 
} 
관련 문제