2011-08-07 18 views
6

Có rất nhiều câu hỏi trên SO than phiền thực tế là quy tắc Phân tích mã CA2000 đang được áp dụng có thể quá khắt khe bởi VS2010, nhưng dường như tôi đã gặp phải trường hợp cần áp dụng, nhưng không phải.Tại sao Bitmap gây ra quy tắc CA2000, nhưng Hình ảnh thì không?

Xét đoạn mã sau:

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); 

Bây giờ nếu tôi chạy Phân tích Mã trong Visual Studio 2010 về vấn đề này, nó sẽ phàn nàn về newImage không được xử lý (dễ dàng sửa chữa, đặt nó trong một sử dụng khối) , nhưng nó không phàn nàn về srcImage (cũng có một phương thức Dispose() mà tôi không bao giờ gọi). Có ai biết tại sao Code Analysis không phàn nàn ở đây?

Trả lời

0

Vâng nó nên "phàn nàn về srcImage" quá, tuy nhiên tôi đoán rằng nó không phàn nàn về nó bởi vì bạn đang đi qua nó để phương pháp DrawImage "gr.DrawImage(srcImage, new Rectangle(0, 0, newWidth, newHeight));", Vì vậy, hoặc nó không phải là đủ thông minh để biết rằng nó sẽ không được sử dụng cho nhiều hành động hơn sau khi phương thức được trả lại hoặc có thể giả sử rằng bạn đã sử dụng nó trong trường hợp gr sẽ được xử lý. Dù sao, bạn nên sử dụng using cho srcImage giống như những gì bạn đang làm với newImage và không tuân theo Phân tích mã về điều đó.

+0

Tôi nghĩ lúc đầu, nhưng sau đó tôi đã xem xét các câu hỏi CA2000 khác trên SO và khá nhiều tất cả chúng đều có quy tắc được kích hoạt bởi việc truyền tham số đó tới một hàm khác (mặc dù thường là với các hàm tạo). Thật kỳ lạ khi một quy tắc gây phiền nhiễu (đối với nhiều người, đánh giá bởi số lượng câu hỏi SO) sẽ rất tha thứ trong tình huống này. –

+0

Yup, tôi đồng ý rằng điều đó thật khó chịu, tuy nhiên chúng tôi nên "like you already did" không dựa vào Code Analysis để khắc phục các vấn đề về mã của chúng tôi, thay vào đó chỉ cần sử dụng chúng để kiểm tra lại và xem chúng ta có quên thứ gì đó ở đây không ... –

+0

Vâng ... nhưng đó là loại thất bại mục đích của các công cụ như vậy. Lý do tôi sử dụng chúng là vì vậy họ có thể chỉ ra các địa điểm mà tôi đã làm điều gì đó sai, để giúp tôi giải quyết rắc rối để đi qua toàn bộ quá trình săn mã cơ bản khổng lồ cho những việc nhỏ như thế này. –

5

CA2000 và các quy tắc tương tự/liên quan CA2213 (DisposableFieldsShouldBeDisposed) và CA1001 (TypesThatOwnDisposableFieldsShouldBeDisposable) khá nghiêm ngặt về cách chúng nhận ra "quyền sở hữu" của một lần dùng một lần. Họ sẽ chỉ xem xét mã của bạn là chủ sở hữu của một cá thể dùng một lần nếu một hàm tạo cá thể được sử dụng để tạo cá thể trực tiếp trong mã của bạn. Vì bạn sử dụng Image.FromFile để tạo cá thể cho srcImage, quy tắc không nhận ra mã của bạn là chủ sở hữu.

Nếu bạn không đồng ý với hành vi quy tắc này, bạn có thể tạo báo cáo lỗi tại https://connect.microsoft.com/visualstudio/feedback. (Nếu bạn quan tâm đến các quy tắc hiện trường dùng một lần, bạn có thể muốn bỏ phiếu cho đề xuất hiện tại của https://connect.microsoft.com/VisualStudio/feedback/details/485291/typesthatowndisposablefieldsshouldbedisposable-rule-ca1001-is-too-permissive trong khi bạn đang ở đó.)

+0

Có cách nào thay đổi quy tắc có thể giúp tôi thực sự hữu ích mà không quay lại và gắn thẻ nhiều phương thức với thuộc tính cho biết rằng chúng được coi là chiếm đoạt, từ bỏ hoặc giả mạo quyền sở hữu của IDisposable (tức là hành vi thay đổi tùy thuộc vào các yếu tố một công cụ không nên được theo dõi)? Việc giới thiệu hành vi như vậy có thể đáng giá, nhưng việc thêm đủ thẻ để có được các báo cáo rõ ràng có thể là rất nhiều công việc. – supercat

+0

@supercat: Sẽ khá khả thi khi quy tắc được viết theo cách như vậy để phát hiện ra phương thức được gọi là phương thức tạo ra một cá thể mới dùng một lần mà không lưu trữ cá thể đó trong trạng thái riêng của nó. Điều đó nói rằng, quy tắc sẽ không thể xử lý các mẫu tạo phức tạp như sử dụng IoC mà không cần thêm một số siêu dữ liệu. Tuy nhiên, bất kỳ thuộc tính nào cũng nên đi vào phương pháp của nhà máy chứ không phải là người tiêu dùng của họ. –

+0

Nếu máy quét có thể xem mã cho các nhà máy, nó có thể xác định rằng chúng tạo và trả về các cá thể IDisposable mới.Tuy nhiên, không phải tất cả các nhà máy đều có mã có thể truy cập được vào máy quét. Thêm sự công nhận của các nhà máy sẽ làm cho máy quét tạo ra các cảnh báo hữu ích hơn, nhưng cũng có nhiều cảnh báo giả mạo hơn, trừ khi nó cũng có thể nhận ra khi các đối tượng IDisposable được tách ra hợp pháp; sự công nhận như vậy sẽ gây ra một số vấn đề phức tạp, mặc dù .... – supercat

Các vấn đề liên quan