2010-02-06 27 views
6

... nếu tôi sử dụng IDisposable trong biến cục bộ, nhưng không gọi Dispose() hoặc sử dụng mẫu using().Có quy tắc FxCop cho IDisposable được sử dụng cục bộ không?

public void BadMethod() 
{ 
    var fs = new FileStream("file.txt", FileMode.Create); 
    fs.WriteByte(0x55); 
    // no dispose, no using() 
} 

Giống như quy tắc "Types that own disposable fields should be disposable" cho trường.


EDIT: thay thế MemoryStream bằng FileStream, vì MemoryStream chỉ cấp phát bộ nhớ và không sử dụng các nguồn lực (unmanaged), để ai đó có thể thảo luận về một Dispose() gọi bắt buộc.

+1

Tại sao bạn muốn điều đó? Nó là vô nghĩa, bộ nhớ không phải là dùng một lần. Hy vọng rằng chúng tôi sẽ không nhận được một công cụ mà nói nó là, nó sẽ phá hủy tâm trí lập trình không thể khắc phục. –

+8

@nobugz: Nó vẫn còn đúng ở đây để thực sự gọi Dispose trên MemoryStream. Thực tế là MemoryStream không sử dụng bất kỳ tài nguyên không được quản lý nào là chi tiết * implementation *. ** Hợp đồng ** cho MemoryStream nói rằng nó thực hiện IDisposable, và như vậy, nó nên luôn luôn có Dispose được gọi là trên nó. Đó là * luôn luôn * tốt hơn để mã chống lại hợp đồng hơn so với các chi tiết thực hiện cụ thể. – casperOne

+0

@capser: vâng, một số lập trình viên như Máy cho họ biết phải làm gì. Đó là tôn giáo mà tôi không đăng ký, tôi thích phá vỡ quy tắc một cách có chủ ý. Đi trước và làm theo cách của bạn, bạn sẽ không bao giờ được chứng minh sai. Chỉ chậm chạp. –

Trả lời

15

Có quy tắc FxCop cho điều này không? Có và không.

Trong FxCop 1.35, đó là những gì Visual Studio 2005 phân tích mã dựa trên, có một quy tắc DisposeObjectsBeforeLosingScope đã làm chính xác điều này.

Trong FxCop 1.36 (Phân tích mã Visual Studio 2008), họ đã xóa công cụ phân tích lưu lượng dữ liệu của mình, điều này có nghĩa là quy tắc này cũng phải bị xóa.

Tuy nhiên, trong FxCop tiếp theo (Visual Studio 2010 Phân tích Code), có vẻ như DisposeObjectsBeforeLosingScope đã trở lại!

+0

+1. Không biết nó được thêm vào năm 2010. Trong khi tôi không nhất thiết phải đồng ý với quy tắc, đây là câu trả lời trực tiếp cho câu hỏi. –

+0

BTW: Trên liên kết thứ hai của bạn: "Trả lại một đối tượng dùng một lần yêu cầu đối tượng được xây dựng trong khối thử/cuối cùng bên ngoài khối sử dụng" nghĩa là ?? – ulrichb

+1

Họ thực sự bao gồm điều này trong mẫu trong bài viết đó. Nhìn vào phương thức 'OpenPort2'. Về cơ bản, nếu đối tượng được xây dựng nhưng không khởi tạo được, nó sẽ là 'Dispose()' 'd trước khi ném ngoại lệ cho người dùng (nếu không nó sẽ nằm ngoài phạm vi). Một 'using' sẽ không thích hợp ở đây vì người gọi * được mong đợi gọi là' Dispose() 'sau đó. – bobbymcr

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