2011-01-20 32 views
15

là việc kiểm tra tình trạng thực sự dư thừa trong các mẫu sau đây ?:Redundant điều kiện kiểm tra trước khi chuyển nhượng gợi ý cho C# trong Resharper 5

public class MyClass  { 
    public bool MyProperty { get; set; } 

    public void DoSomething(bool newValue) { 
     // R# says: redundant condition check before assignment 
     // on the following line: 
     if (MyProperty != newValue) { // <====== 
      MyProperty = newValue; 
     } 
    } 
} 

Tôi biết rằng một trong hai cách MyProperty sẽ được thiết lập để newValue, nhưng là việc kiểm tra không cần thiết?

Trong Adobe Flex, getter is called implicitly by the VM hoạt động của nó bất cứ khi nào một setter được gọi ngay cả khi không có kiểm tra rõ ràng đang được thực hiện. Kết quả cuối cùng là kiểm tra trước khi một kết quả gán trong hai kiểm tra, một kiểm tra và một ngầm, dẫn đến một kiểm tra dự phòng. Có bất cứ điều gì tương tự xảy ra trong C#?

Trả lời

10

Chỉ có hai tình huống mà tôi đã thấy loại séc này.

Đầu tiên là khi có một dòng mã bổ sung đặt thuộc tính khác trên đối tượng thành True để cho biết đối tượng đã được sửa đổi. Điều này thường được sử dụng khi cố gắng quyết định có nên duy trì trạng thái của đối tượng cho một cái gì đó giống như một cơ sở dữ liệu hay không.

Tình huống thứ hai là khi các loại được đề cập là không thay đổi. Bạn có thể muốn tránh đặt giá trị và do đó tạo chuỗi mới, ví dụ: khi các giá trị giống nhau. Thậm chí sau đó, tôi đã chỉ nhìn thấy nó trong một số ứng dụng mà việc sử dụng bộ nhớ là rất quan trọng.

+1

Trong trường hợp của tôi nó xung quanh một hình thức cửa sổ 'tài sản TopMost' mà không có tác dụng phụ. Điểm rất tốt về các giá trị bất biến. –

1

Tôi có thể nói rằng séc là không cần thiết. Nó sẽ có ý nghĩa hơn nếu bạn đã thực hiện INotifyPropertyChanged, nhưng sau đó kiểm tra sẽ được trong setter để tránh kích hoạt sự kiện nếu không có thay đổi thực tế được thực hiện.

4

Trong trường hợp cụ thể này, nó là không cần thiết về mặt logic, vì không có mã nào được thực hiện trong bộ nạp - chỉ là một trình bao bọc thẳng quanh trường riêng. Nếu bạn đang ở trong thói quen đưa những thứ trong getter của bạn mà sẽ có tác dụng phụ, tôi muốn nói để vô hiệu hóa cảnh báo R # đó.

Có thể đáng để đặt thứ gì đó vào bộ thu tài sản và xem liệu ReSharper có cho rằng đó là dự phòng hay không. Nếu có, thì tôi sẽ gọi đó là lỗi R #.

+1

Tôi đã thay đổi thuộc tính thành 'int' và tăng giá trị trong getter và tôi vẫn thấy cùng một gợi ý, vì vậy tôi sẽ xem xét nó là một lỗi Resharper. –

+0

Điều cần biết, cảm ơn - Tôi sẽ để mắt mở cho kịch bản đó trong nội dung của tôi. –

0

if (MyProperty != newValue) là không cần thiết, để lại dòng sẽ mang lại kết quả tương tự

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