2010-06-29 22 views
6

Ok, do đó, tôi có bit này tiện lợi của mã từ Microsoft, và tôi có một chút nấc cục mà tôi muốn loại bỏ.Biến 'x' được khai báo nhưng không bao giờ được sử dụng lỗi

Mã gốc in ra ChangeConflictException x trên bàn điều khiển, nhưng tôi đã xóa dòng này. Bây giờ, mỗi khi tôi sử dụng bit này của mã, tôi nhận được lỗi: "Biến 'x' được khai báo nhưng không bao giờ được sử dụng".

Cách hiệu quả nhất để loại bỏ lỗi này trong khi giữ lại chức năng của mã là gì?

//See http://msdn.microsoft.com/en-us/library/bb386918.aspx 
try 
{ 
    DB.SubmitChanges(ConflictMode.ContinueOnConflict); 
} 

catch (ChangeConflictException x) 
{ 
    foreach (ObjectChangeConflict occ in DB.ChangeConflicts) 
    { 
     occ.Resolve(RefreshMode.KeepChanges); 
    } 
} 
// Submit succeeds on second try. 
DB.SubmitChanges(ConflictMode.FailOnFirstConflict); 
+5

Chỉ cần làm rõ, đây là cảnh báo chứ không phải lỗi, đúng không? – Robaticus

+3

@Robaticus - trừ khi bạn bật cảnh báo dưới dạng lỗi, p –

+0

Rất tiếc! Nhưng vâng, tôi đã sai khi gọi đó là lỗi không phải là cảnh báo. – sooprise

Trả lời

22

Trình biên dịch là đúng; nó chỉ cũng có thể là:

catch (ChangeConflictException) 
{ 
    foreach (ObjectChangeConflict occ in DB.ChangeConflicts) 
    { 
     occ.Resolve(RefreshMode.KeepChanges); 
    } 
} 

làm hạn chế trường hợp ngoại lệ mà nhập khối này, nhưng không không khai báo một biến đối với nó. Biến này hữu ích nếu bạn muốn kiểm tra giá trị, ghi nhật ký hoặc bọc nó trong một ngoại lệ khác. Chỉ để hoàn thành (không áp dụng ở đây) thường là một lần ném lại phải là throw;, khôngthrow x; (để bảo vệ ngăn xếp dấu vết).

+0

Ok, tôi nghi ngờ bạn có thể xóa 'x', nhưng mã quá phức tạp để tôi có thể biết liệu nó có thay đổi đáng kể hay không. Cảm ơn! – sooprise

3

Mặc dù trong trường hợp này, bạn chỉ có thể loại bỏ biến 'x' (như đã đề cập bởi Marc). Nói chung, đối với kịch bản mà tôi có những cảnh báo và tôi không thể thay đổi mã (như sử dụng một số lĩnh vực bằng cách phản ánh) tôi thường thích thực hiện một cuộc gọi không có gì để phương pháp biên dịch có điều kiện mà ngăn chặn cảnh báo gây phiền nhiễu như vậy.

Mã bên dưới.

catch (ChangeConflictException x) 
    { 
    DoNothingWith(x);// This suppress the 'x' not used warning 
    foreach (ObjectChangeConflict occ in DB.ChangeConflicts) 
    { 
     occ.Resolve(RefreshMode.KeepChanges); 
    } 
    } 

    [Conditional("Debug")] 
    public static void DoNothingWith(object obj){ 

    } 

tham khảo từ MSDN về thuộc tính Conditional: "Các cuộc gọi đến một phương pháp có điều kiện hoặc là bao gồm hoặc bỏ qua phụ thuộc vào việc biểu tượng này được xác định tại thời điểm cuộc gọi Nếu biểu tượng được định nghĩa, các cuộc gọi được bao gồm. Nếu không, cuộc gọi (bao gồm cả việc đánh giá các tham số của cuộc gọi) sẽ bị bỏ qua. "

+0

Bạn cũng có thể làm điều này: 'x = x'. –

+4

@Loadmaster: Vui lòng giải thích cho lớp học cách loại bỏ cảnh báo "không được sử dụng tại địa phương" bằng cách thay thế cảnh báo bằng cảnh báo "địa phương được chỉ định cho chính nó" là cải tiến. –

+0

Um, được rồi, tôi không nghĩ rằng trình biên dịch sẽ bắt được điều đó. –

1
#pragma warning disable 0168 

catch (ChangeConflictException x) 
{ 
    // code here 
} 

#pragma warning enable 0168 
Các vấn đề liên quan