Đây là một trường hợp FxCop là mạnh mâu thuẫn với lựa chọn thiết kế trong .NET Framework. Vấn đề được gây ra bởi StreamWriter giả định quyền sở hữu của luồng. Đó là nói chung một sự sụp đổ "trong sự thành công của sự lựa chọn thiết kế", hầu hết các lập trình viên sẽ giả định rằng đóng StreamWriter là đủ để có được dòng xử lý. Đặc biệt như vậy khi họ sử dụng Close() thay vì Dispose().
Hoạt động tốt trong phần lớn các trường hợp. Hầu hết các trường hợp, một cách sử dụng cụ thể ở đây là rất có vấn đề là CryptoStream. Một lớp yêu cầu xả nước và không thể chẩn đoán được sự cố khi luồng cơ bản bị đóng trước khi CryptoStream bị xóa và xử lý. Một trường hợp cảnh báo FxCop sẽ phù hợp, mặc dù nó quá khó hiểu để dễ dàng nhận ra vấn đề cụ thể;)
Và trường hợp chung mà một lập trình viên đã viết phương thức Dispose() của riêng mình và quên làm cho nó an toàn được gọi nhiều lần. Đó là những gì cảnh báo FxCop có ý định mang đến sự chú ý, nó không phải là đủ thông minh để có thể thấy rằng một phương pháp Vứt bỏ là trong thực tế an toàn.
Trong trường hợp cụ thể này, cảnh báo FxCop chỉ là vô ích. Tất cả các khung công tác của .NET Framework được cung cấp Dispose() đều an toàn. FxCop sẽ tự động loại bỏ các cảnh báo này cho mã .NET framework. Nhưng không, Microsoft cũng sử dụng nó. Có lô thuộc tính [SuppressMessage] trong mã nguồn khuôn khổ .NET.
Làm việc xung quanh cảnh báo quá xấu và dễ xảy ra lỗi. Và vô nghĩa vì không có gì thực sự sai. Hãy nhớ rằng FxCop chỉ là một công cụ chẩn đoán, được thiết kế để tạo ra "bạn đã xem xét thông báo này". Nó không phải là một cảnh sát mà sẽ đưa bạn vào tù khi bạn bỏ qua các quy tắc. Đó là công việc của một trình biên dịch.
Sử dụng thuộc tính [SuppressMessage] để tắt cảnh báo.
Nguồn
2013-03-13 16:00:40
Bạn có thể gọi Dispose() cho cùng một đối tượng nhiều lần, theo Microsoft. –
@MatthewWatson, một tài liệu tham khảo trích dẫn Microsoft về điều đó sẽ tốt đẹp .. –
@MatthewWatson khi 1nd sử dụng cố gắng vứt bỏ một đối tượng được allready xử lý gây ra lỗi – CloudyMarble