2011-04-20 26 views
8

Tôi vừa tìm thấy một lỗi trong chương trình của tôi (sau khi một số lượng gỡ lỗi và xé tóc của tôi)C#: Tìm Bugs: if (false)

bool first = true; 

foreach (RdAbstractNode node in listNodes) 
{ 
    if (!first) 
    { 
     // do stuff (does not change first) 
    } 
    // do more stuff (does not change first) 
} 

Như bạn thấy first luôn là true - không bao giờ đã thay đổi. Vì vậy, if(!first) về cơ bản là if(false).
Trình biên dịch không tạo ra cảnh báo mặc dù nó được đặt ở cấp 4 (mức cao nhất).

Tôi làm cách nào để tìm lỗi tương tự if(false)?

Tôi đang sử dụng VS 2010, Net 4.0 trình biên dịch, dự án thiết Net 2.0

+2

'// do stuff' của bạn có thể làm điều gì đó có thể lật' đầu tiên' nhưng tôi đã thấy Resharper hiển thị cảnh báo về nội dung luôn sai hoặc đúng. –

+0

hoặc đúng hơn, '// thực hiện nhiều nội dung hơn 'sẽ cần phải là công cụ lật biến. – cdeszaq

Trả lời

13

Với Resharper bạn sẽ nhận được cảnh báo như thế này

enter image description here

+1

+1 để đề xuất Resharper. Đó là một add-on đắt tiền đối với một số người, nhưng nó là vô giá trong các ví dụ như thế này. – Pretzel

+0

Có gì miễn phí hay tôi chỉ phải chi 42 € cho giấy phép học tập? –

+0

@Pretzel: "Vô giá" là một đoạn. – jason

10

Tôi không biết của một tính năng biên dịch sẽ giúp bạn - bạn cần phải kiểm tra đơn vị.

+0

Trình biên dịch không cảnh báo về các biến chưa được gán. Nó không biết nếu một biến có một giá trị không đổi. Nhưng nó thậm chí không cảnh báo về 'if (false) ' –

+0

@Simon Ottenhaus: Các biến không được gán là rất khác so với những gì bạn có ở đây. – jason

+0

Tôi nhận được cảnh báo biên dịch nếu tôi có khối if (false) có mã trong đó. Nếu chỉ có một bình luận trong đó, trình biên dịch dường như đang tối ưu hóa khối mà không có cảnh báo. Tôi đồng ý với @dahlbyk: bạn có thể muốn sử dụng phân tích mức độ phù hợp của mã hoặc trình phân tích tĩnh. Nếu bạn muốn biết tại sao đây không phải là cảnh báo, bài viết này có thể trợ giúp: http://blogs.msdn.com/b/ericlippert/archive/2011/03/03/danger-will-robinson.aspx – mcw0933

0

Trình biên dịch sẽ cảnh báo cho bạn về những điều hiển nhiên như mã unreachable dựa trên một giá trị không đổi trong câu lệnh if - ví dụ "if (false)". Tuy nhiên, vì biến có thể bị thay đổi, điều này sẽ không xảy ra trong trường hợp này.

1

Tôi đồng ý rằng Resharper là một công cụ tốt để có, nhưng tôi muốn thêm rằng tôi nghĩ rằng điều này chứng minh một lý do KHÔNG sử dụng cấu trúc này.

Một thay thế có thể là:

EDIT:

//.net 4.0 
    var firstNode = listNodes.First(); 
     //do something special for first. 

    foreach(var node in listNodes.Skip(1)) 
    { 
     //do something for the rest. 
    } 

//.net 2.0 
using (IEnumerator<RdAbstractNode> enumerator = listNodes.GetEnumerator();) 
{ 
    if (!enumerator.MoveNext()) 
     return; 

    RdAbstractNode first = enumerator.Current; 
    //do something with first 
    while(enumerator.MoveNext()) 
    { 
     RdAbstractNode currentNode = enumerator.Current; 
     //do something with the node. 
    } 
} 

Chúng ta thường thấy mình cần phải có một số loại xử lý đặc biệt cho các phần tử đầu tiên, đôi khi nó tốt hơn để thay đổi logic và thực hiện tất cả các bộ đồng phục. Nếu chúng ta không thể thì tôi luôn muốn phân biệt rõ ràng việc xử lý trường hợp đặc biệt với phần còn lại của các phần tử thay vì làm tổ nó.

+0

.Net 2.0: Không bỏ qua (1) –

+0

mm..missed rằng - nhưng có thể được thực hiện theo cách dài (er): 'var enumerator = listNodes.GetEnumerator(); enumerator.MoveNext(); var first = enumerator.Current; while (enumerator.MoveNext()) { // làm điều gì đó với enumerator. Current } ' – NightDweller

+0

Lưu ý rằng' IEnumerator 'nên được xử lý. Và nếu thích hợp, bạn nên xử lý lệnh 'MoveNext()' đầu tiên trả về 'false'. – dahlbyk

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