2013-03-03 31 views
6

phương pháp khuyến nông Tôi đã sau cho chuỗi:Mã Phân tích hành vi quy tắc CA1062

public static bool IsNullOrEmpty(this string target) 
{ 
    return string.IsNullOrEmpty(target); 
} 

... và trong các mã tôi sử dụng nó như sau:

public static string DoSomethingOnString(this string target) 
{ 
    if (target.IsNullOrEmpty()) 
     return target; 

    target = target.Trim(); //This line causes CA1062 violation 

    return target; 
} 

Bây giờ, nếu tôi chạy phân tích mã về điều này, tôi vi phạm quy tắc CA1062. Nhưng nếu tôi thay đổi mã thành:

public static string DoSomethingOnString(this string target) 
{ 
    if (string.IsNullOrEmpty(target)) //CHANGED LINE 
     return target; 

    target = target.Trim(); //This line DOES NOT cause CA1062 violation anymore 

    return target; 
} 

... thì vẫn ổn.

Tại sao nó cho rằng tôi không kiểm tra điều kiện rỗng trong ví dụ đầu tiên? Nó chỉ kiểm tra chuỗi .IsNullOrEmpty hoặc string.IsNullOrWhiteSpace? Có cách nào để làm cho CA nhận ra phương pháp mở rộng của tôi, hoặc tôi sẽ cần phải ngăn chặn quy tắc này?

UPDATE: Nếu bạn có cùng một vấn đề, bạn có thể biểu quyết về mục phản hồi tôi nộp MS Connect: Code Analysis rule CA1062 raises false alarm

+0

* Ở đâu * là vi phạm? Trong phương pháp mở rộng? Trong cuộc gọi * đến * phương pháp mở rộng? Hoặc sau nó? Bất cứ khi nào bạn đề cập đến một lỗi/cảnh báo trong một câu hỏi, * xin vui lòng * cho thấy nơi nó xảy ra. –

+0

Nhìn vào mã IL, phân tích mã không hoạt động trên mã bạn thấy trong IDE của bạn, vì vậy có lẽ điều này sẽ giúp ích. – Gorgsenegger

+0

Bạn có thể sử dụng 'ValidatedNotNullAttribute' để cho FxCop biết. Thêm tại đây: http://esmithy.net/2011/03/15/suppressing-ca1062/ –

Trả lời

10

Tại sao nó nghĩ rằng tôi không kiểm tra các điều kiện null trong những người đầu tiên thí dụ?

Rất đơn giản, FxCop không hiểu rằng nếu phương pháp mở rộng IsNullOrEmpty của bạn thực hiện tương tự như string.IsNullOrEmpty. Nó không nhận ra rằng nếu target là null, IsNullOrEmpty sẽ trả về true và phương pháp của bạn sẽ thoát. Về cơ bản, tôi nghi ngờ nó có kiến ​​thức được xây dựng trong số string.IsNullOrEmpty. Code Contracts có nhiều khả năng thành công ở đây, vì tôi tin rằng FxCop chỉ thực hiện kiểm tra tương đối nông đối với mã của bạn, so với lý do sâu sắc về Hợp đồng mã. Bạn có thể trang trí phương thức IsNullOrEmpty của mình với ValidatedNotNullAttribute để thông báo cho FxCop những gì đang diễn ra.

public static bool IsNullOrEmpty([ValidatedNotNullAttribute] this string target) 
{ 
    return string.IsNullOrEmpty(target); 
} 
//The naming is important to inform FxCop 
sealed class ValidatedNotNullAttribute : Attribute { } 

Đây chỉ là ví dụ về việc phân tích mã đôi khi có thể quá hăm hở phê bình. Đó là một cái gì đó tôi đã nhìn thấy với khá nhiều công cụ phân tích mã tôi đã sử dụng. Lựa chọn của bạn thường dọc theo dòng:

  • Thay đổi mã của bạn để làm việc xung quanh công cụ phân tích mã, ngay cả khi nó đã được tốt trước
  • Suppress các quy tắc tại các địa điểm cụ thể, sau khi tự kiểm tra mỗi trong số họ
  • Suppress toàn bộ quy tắc nếu họ thường xuyên cung cấp cho dương tính giả
  • Hãy từ bỏ các công cụ phân tích mã hoàn toàn

Bạn cũng nên đăng nhập một lỗi hoặc tính năng yêu cầu, tất nhiên ...

+0

Tôi đã cập nhật các mẫu mã có nhận xét về dòng gây ra vi phạm. – Anil

+0

@Anil: Phải - đó chỉ là vấn đề của FxCop không phải là "hiểu" những gì phương pháp của bạn sẽ làm. –

+0

@Anil Tôi đã chỉnh sửa câu trả lời của mình để làm rõ một chút. –

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