2014-05-13 6 views
1

FXCop에서 memoryStream 개체를 두 번 이상 삭제한다고 불만스럽게 보일 수 없습니다. 내가 말할 수있는 것만 큼 가까이서, 나는 그것을 마침내 블록에 버린다.개체를 여러 번 처리하지 마십시오

전체 오류 메시지는 다음과 같습니다 폐기하지 마십시오

CA2202 여러 번 한 번 방법 'MessageTransform.GetEnvelope (메시지)'보다 더 배치 될 수있다 'MemoryStream을을'객체 객체. 당신이 라인 : 객체에 한 번 이상을 폐기 호출해서는 안 System.ObjectDisposedException가 발생하지 : 48 API를 MessageTransform.cs 48

 var memoryStream = new MemoryStream(); 
     try 
     { 
      var messageBuffer = message.CreateBufferedCopy(int.MaxValue); 
      var xPathNavigator = messageBuffer.CreateNavigator(); 

      var xmlWriter = XmlWriter.Create(memoryStream); 
      xPathNavigator.WriteSubtree(xmlWriter); 
      xmlWriter.Flush(); 
      xmlWriter.Close(); 

      memoryStream.Position = 0; 
      var xdoc = XDocument.Load(XmlReader.Create(memoryStream)); 
      return xdoc; 
     } 
     catch (ApplicationException e) 
     { 
      Console.WriteLine(e.Message); 
      return null; 
     } 
     finally 
     { 
      memoryStream.Dispose(); 
     } 

내가 사용하는 블록에서 동일한 코드를 포장하면 나도 같은 얻을 오류.

using (var memoryStream = new MemoryStream()) 
{ 
    var messageBuffer = message.CreateBufferedCopy(int.MaxValue); 
    var xPathNavigator = messageBuffer.CreateNavigator(); 

    var xmlWriter = XmlWriter.Create(memoryStream); 
    xPathNavigator.WriteSubtree(xmlWriter); 
    xmlWriter.Flush(); 
    xmlWriter.Close(); 

    memoryStream.Position = 0; 
    var xdoc = XDocument.Load(XmlReader.Create(memoryStream)); 
    return xdoc; 
} 

은 과민의 FxCop이 단지 문제인가 또는 사용하여 블록 또는 .Dispose()가 어떻게 든 System.IO.MemoryStream 적용되지를 사용합니까?

답변

1

XmlWriter은 그 규칙이 수용하는 방법 인 Close에서 스트림을 처리 할 수 ​​있습니다. 그러나이 동작은 조건부이며 사용자가 설명하는 방식으로 스트림 용으로 만들어진 XmlWriter에서 호출하면 안됩니다.

1

니콜 (Nicole)에 설명 된 바와 같이, XmlWriters'Close은 오류를 일으키는 개체를 처리 할 수 ​​있습니다.

using 문과 try-finally 문은 완전히 똑같은 것을 지적하고 싶습니다. 컴파일러는 using 문을 실행과 함께 tryblock으로 변환하고 finallyblock에 Dispose()를 변환합니다.

관련 문제