Tôi sử dụng phân tích mã tĩnh trong các dự án của chúng tôi để kiểm tra vi phạm mã. Một trong những quy tắc được sử dụng rộng rãi là CA2213, kiểm tra việc xử lý đúng các trường dùng một lần.Quy tắc phân tích mã CA2213 và thuộc tính tự động triển khai
Tôi nhận thấy CA2213 không kiểm tra việc xử lý các thuộc tính được tự động triển khai.
Hơn nữa CA2213 không kiểm tra việc loại bỏ các trường hoặc thuộc tính được tự động triển khai nếu lớp kế thừa từ lớp thực hiện IDisposable và không ghi đè phương thức Vứt bỏ.
thực tế ví dụ:
public sealed class Good : IDisposable {
private Font font;
public Font Font {
get { return font; }
set { font = value; }
}
public Good() { font = new Font("Arial", 9); }
public void Dispose() { /* Do nothing */ } // CA2213
}
public sealed class Bad : IDisposable {
public Font Font { get; set; }
public Bad() { Font = new Font("Arial", 9); }
public void Dispose() { /* Do nothing */ } // No warning
}
Đã có người khác gặp phải hành vi này? Đây có phải là do thiết kế hoặc lỗi trong quy tắc CA2213 không?
Trong trường hợp bạn liệt kê, Phân tích mã vẫn yêu cầu bạn xử lý 'f' theo cách nào đó, thường bằng cách loại bỏ thủ công và lưu ý trong trường hợp rằng trường được tiêm không thuộc sở hữu của lớp hiện tại. Đây là một giải pháp tốt cho tôi. Những gì không phải là một giải pháp tốt là không hiển thị các vấn đề phân tích mã ở tất cả, chỉ đơn giản bởi vì 'f' là một autoproperty hoặc bởi vì FieldIsInjected xuất phát từ một lớp IDisposable và không ghi đè Vứt bỏ (bool) –