2014-11-13 4 views
0

Является ли поле равным null после использования оператора?Life after using statement

class Program 
{ 
    MyDBContext context; 
    public void Start() 
    { 
     Run1(); 
     Run2(); 
     ... 
    } 
    void Run1() 
    { 
     using (context = new MyDBContext()) 
     { 
      //...some context machination 
     } 
    } 
    void Run2() 
    { 
     if(context != null) 
     { 
      //?? GC not collect context (memory leak) 
     } 
    } 
} 

В моем приложении у меня утечка памяти. Утечка в классе, которая работает с инфраструктурой сущности. Возможно, контекст, не собирающий GC, может хранить много секретной информации где-то в другом месте.

ответ

1

Оператор using автоматически запускает метод context.Dispose() объекта IDisposable. Таким образом, ваш объект не будет null после оператора using, если вы явно не установили его в null.

Кроме того, создателю MyDBContext необходимо надлежащим образом обрабатывать внутреннюю очистку в методе Dispose(), иначе у вас могут быть проблемы с памятью (особенно с неуправляемыми объектами).

4

using не сделает ваш context null - он просто вызовет метод Dispose().

Вы не должны определить context как частное поле, определяют его как локальную переменную вместо:

class Program 
{ 
    // MyDBContext context; 
    public void Start() 
    { 
     Run1(); 
     Run2(); 
     ... 
    } 
    void Run1() 
    { 
     using (var context = new MyDBContext()) 
     { 
      //...some context machination 
     } 
    } 
    void Run2() 
    { 
     using (var context = new MyDBContext()) 
     { 
      // ... 
     } 
    } 
} 
1

На конце с помощью блока, метод MyDBContext.Dispose будет называться, освобождает неуправляемые ресурсы (предполагая, что метод был правильно реализован), но поле не будет установлено без значения null.

Не устанавливать его в значение null не должно быть причиной утечки памяти. Проблема в другом месте.

 Смежные вопросы

  • Нет связанных вопросов^_^