2014-11-13 1 views
0

문장을 사용한 후에 필드가 null입니까?문장 사용 후 수명

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에 의해 수집되지 않을 수도 있습니다, mayby ​​그는 다른 많은 비밀 정보를 다른 곳에 저장합니다.

답변

1

using 문은 개체의 context.Dispose() 메서드 만 자동으로 실행합니다. 따라서 객체를 명시 적으로 null로 설정하지 않는 한 객체는 using 문 뒤에 null이되지 않습니다.

또한 MyDBContext 작성자는 Dispose() 메서드에서 내부 정리를 올바르게 처리해야합니다. 그렇지 않으면 메모리 문제가있을 수 있습니다 (특히 관리되지 않는 개체의 경우).

4

usingcontext을 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

은 Using 블록의 끝에서, MyDBContext.Dispose 방법은 관리되지 않는 리소스를 자유롭게 호출됩니다 (메소드가 올바르게 구현되었다고 가정), 필드는 null이 설정되지 않습니다.

null로 설정하지 않으면 메모리 누수의 원인이되어서는 안됩니다. 문제는 다른 곳에있다.