2014-12-16 6 views
0

MemoryStream 개체 처분에 대한 코드 분석 규칙을 만족시키는 데 문제가 있습니다.코드 만족 MemoryStream 및 CryptoStream을 사용하여 폐기 규칙 분석

이 지금 내 코드입니다 :

byte[] bytes; 
MemoryStream stream = new MemoryStream(); 

using (CryptoStream cs = new CryptoStream(stream, transform, CryptoStreamMode.Write)) 
{ 
    cs.Write(buffer, 0, buffer.Length); 
} 

bytes = stream.ToArray(); 
stream.Close(); 

return bytes; 

이 스트림 두 번을 을 배치 될 수있다, 또는 이 (각 하나의 경고)에 배치 될 수 있다는 경고가 발생합니다.

나는 또한 using(MemoryStream stream = new MemoryStream()) 블록으로 포장 해 보았습니다. 그 결과 이전 경고가 나타납니다.

마지막으로 Close() 또는 Dispose()으로 전화를 제거하면 후자의 경고가 나타납니다.

두 가지 조건을 모두 충족시키는 방법이 있습니까? 문제를 닫을 수있는 예외 경로라고 가정하지만이 클래스의 작동 방식을 잘 모르겠습니다. 합니다 (using 블록 종료시) CryptoStream가 배치

답변

1

나는 개인적으로 내 소스 코드에서 해당 규칙을 억제하는 경향이있다. 당신은 억제하지 않고 규칙을 만족 싶은 경우이 작업을 수행해야합니다 어떤 스트림이없는 경우 당신은

var bytes = transform.TransformFinalBlock(buffer, 0, buffer.Length); 

를 사용하여 모든 스트림을 던질 수

 byte[] bytes = new byte[1024]; 
     byte[] buffer = new byte[1024]; 
     ICryptoTransform transform = null; 

     MemoryStream stream = null; 

     try 
     { 
      stream = new MemoryStream(); 
      MemoryStream tempStream = stream 

      using (CryptoStream cs = new CryptoStream(stream, transform, CryptoStreamMode.Write)) 
      { 
       // set stream to null immediately so it doesn't get disposed by finally 
       stream = null; 

       cs.Write(buffer, 0, buffer.Length); 
       bytes = tempStream.ToArray(); 
      } 
     } 
     finally 
     { 
      if (stream != null) 
      { 
       stream.Dispose(); 
      } 
     } 

     return bytes; 
+0

CA2202에서 결과 코드 결과 개체를 여러 번 처리하지 마십시오. – Blorgbeard

+0

잘 잡습니다. 나는 using 문 안에서 코드의 첫 번째 줄에 steam = null 문을 옮겼다. 그리고 FXCop은 행복하다. 나는 아직도이 규칙의 팬이 아니다. –

+0

경고는 없지만'stream = null'을 설정 한 후에'stream.ToArray()'에 접근 중입니다! – Blorgbeard

0

, 그것은 Dispose를 호출 MemoryStreamClose 부른다.

따라서 Dispose (using을 통해) 또는 Close을 직접 호출 할 필요가 없습니다. 이렇게하면 stream은 정확히 한 번만 처리됩니다. 대부분의 개체가 문제가 두 번 배치되어 있지 않기 때문에이 발사하는 경우

MemoryStream stream = new MemoryStream(); 
using (CryptoStream cs = new CryptoStream(stream, transform, CryptoStreamMode.Write)) 
{ 
    cs.Write(buffer, 0, buffer.Length); 
    return stream.ToArray();    
} 
+0

해당 코드는 CryptoStream 생성자가 throw하는 경우 MemoryStream을 비워 둘 수 있습니다. –

+0

사실이긴하지만 (IMO) 큰 문제는 아닙니다. 비어있는 MemoryStream은 크지 않으며 결국 GC로 처리됩니다. 그리고 CryptoStream의 ctor가 발생하지는 않을 것입니다. 코드 분석 경고 중 하나를 트리거하지 않으면 그 주위에 방법이 보이지 않습니다. – Blorgbeard

+0

이 규칙을 사용하지 않고 2 개의 문을 사용하는 경향이 있습니다. 하지만 당신이 억제하고 항상 처분하고 싶다면 try/finally 블록을 사용하여 답변을 업데이트해야 규칙을 만족시킬 수 있습니다. –

2

, 당신은 필요가 없습니다)

+0

문제의 실제 해결책 (또한 질문 자체는 똑같은 샘플 http : //와 중복된다. 스택 오버플로.co.kr/questions/3831676/ca2202-how-to-solve-this-case) –