2011-08-07 4 views
6

코드 분석 규칙 CA2000이 VS2010에 의해 너무 엄격하게 적용된다는 사실을 안타까워하면서 많은 질문이 제기되었지만, 적용해야하는 경우가있는 것처럼 보였습니다.왜 비트 맵은 CA2000 규칙을 발생 시키지만 이미지는 그렇지 못합니까?

다음과 같은 코드를 생각해 지금이에 비주얼 스튜디오 2010의 코드 분석을 실행하면

Image srcImage = Image.FromFile(source); 
Bitmap newImage = new Bitmap(newWidth, newHeight); 

using (Graphics gr = Graphics.FromImage(newImage)) 
{ 
    gr.DrawImage(srcImage, new Rectangle(0, 0, newWidth, newHeight)); 
} 
newImage.Save(destination, ImageFormat.Jpeg); 

를, 그것을 (쉽게 수정 다른 사용하여 블록에 넣어)에 대한 newImage 배치되지 않는 불평합니다 , 그러나 그것은 srcImage에 대해서 불평하지 않습니다 (또한 절대로 호출하지 않는 Dispose() 메소드가 있음). 누구든지 코드 분석이 여기에 불평하지 않는 이유를 알고 있습니까?

답변

0

너무,하지만 난 당신이 DrawImage 방법 "gr.DrawImage(srcImage, new Rectangle(0, 0, newWidth, newHeight));"에 전달되어 있기 때문에 그것에 대해 불평하지 않습니다 추측 "srcImage에 대해 불평"한다, 그러니 그 점을 알만큼 충분히 영리하지 않다 음 메소드가 리턴 된 후에 더 많은 조치를 위해 사용되지 않거나 처분 될 인스턴스 gr에서 사용했다고 가정했을 수도 있습니다. 어쨌든 newImage과 같이 srcImageusing을 사용해야하며 코드 분석을 따르지 않아야합니다.

+0

처음에 생각했지만 다른 CA2000 질문을 봤는데 꽤 많이 들었습니다. 그들 모두는 다른 함수에 인수를 전달하는 것과 같은 규칙에 의해 트리거됩니다 (일반적으로 생성자가 관련되어 있음에도 불구하고). 이 성가신 규칙 (많은 사람들에게 SO 질문의 수로 판단)이이 상황에서 용서할 수 있다는 것이 이상합니다. –

+0

그래, 나는 그것이 성가신 것에 동의한다. 그러나 우리는 코드 분석을 사용하여 코드 문제를 해결하기 위해 코드 분석에 의존하지 않고 "이중화 체크"를 사용하고 여기저기서 무언가를 잊어 버렸는지 확인해야한다. –

+0

그래 ... 그런 종류의 도구는 그런 도구의 목적에 어긋난다. 내가 그들을 사용하는 이유는 내가 뭔가 잘못한 위치를 지적 할 수 있기 때문에 이와 같은 작은 일을 위해 거대한 코드 기반 사냥을하는 데 어려움을 겪지 않도록하기 위해서입니다. –

5

CA2000 및 유사/관련 CA2213 (DisposableFieldsShouldBeDisposed) 및 CA1001 (TypesThatOwnDisposableFieldsShouldBeDisposable) 규칙은 일회용품의 "소유권"을 인식하는 방법에 대해 다소 엄격합니다. 인스턴스 생성자를 사용하여 코드에서 직접 인스턴스를 만드는 경우에는 코드가 일회용 인스턴스의 소유자로 간주됩니다. Image.FromFile을 사용하여 srcImage에 대한 인스턴스를 만들기 때문에 규칙에서 코드를 소유자로 인식하지 못합니다.

이 규칙 동작에 동의하지 않는 경우 https://connect.microsoft.com/visualstudio/feedback에 버그 보고서를 만들 수 있습니다. (일회용 필드 규칙에 관심이있는 경우 기존에 https://connect.microsoft.com/VisualStudio/feedback/details/485291/typesthatowndisposablefieldsshouldbedisposable-rule-ca1001-is-too-permissive 제안에 투표하고 싶을 수도 있습니다.)

+0

이러한 규칙 변경으로 인해 내가 돌아가고 IDisposable의 소유권을 인수, 양도 또는 허위로 간주해야한다는 것을 나타내는 속성을 가진 많은 메소드에 태그를 붙이지 않고도 실제로 유용하게 사용할 수있는 방법이 있습니까? 도구는 추적 할 수 없어야합니다)? 그러한 행동을 도입하는 것이 가치가있을 수 있지만, 깨끗한 보고서를 얻기에 충분한 태그를 추가하는 것은 많은 작업이 될 수 있습니다. – supercat

+0

@supercat : 호출 된 메소드가 인스턴스를 자체 상태로 저장하지 않고 새로운 일회용 인스턴스를 생성하는 팩토리 메소드임을 감지 할 수있는 방식으로 규칙을 작성하는 것이 가능합니다. 즉, 규칙은 일부 메타 데이터를 추가하지 않고 IoC 사용과 같은 복잡한 생성 패턴을 처리 할 수 ​​없습니다. 그러나 모든 속성은 소비자가 아닌 팩토리 메소드에 있어야합니다. –

+0

스캐너가 팩토리 코드를 볼 수있는 경우 새 IDisposable 인스턴스를 만들고 반환하는 것으로 판단 할 수 있습니다.모든 공장이 스캐너에 액세스 할 수있는 코드를 가지고있는 것은 아닙니다. 공장 인식을 추가하면 스캐너가 더 유용한 경고를 생성하지만 IDisposable 객체가 합법적으로 전달되는 시점을 인식 할 수없는 경우 가짜 경고도 생성됩니다. 그러나 이러한 인식은 많은 까다로운 문제를 야기 할 것입니다 .... – supercat

관련 문제