2009-02-17 41 views
30

Từ msdn tôi có được điều này:C#: Có cần khôi phục cảnh báo pragma không?

#pragma warning disable warning-list 
#pragma warning restore warning-list 

Trong ví dụ này, cả hai disablerestore được sử dụng. Có cần thiết phải restore nếu tôi muốn nó bị vô hiệu hóa cho toàn bộ tệp không?

Giống như, nếu tôi không khôi phục, nó sẽ mang bao xa? Các cảnh báo có bị vô hiệu hóa cho mọi thứ được biên dịch sau đó không? Hoặc chỉ cho phần còn lại của tập tin đó? Hay là nó bị bỏ qua?

Trả lời

35

Nếu bạn không khôi phục tính năng vô hiệu hóa đang hoạt động cho phần còn lại của tệp.

Hành vi thú vị này là không phải được xác định trong language specification. (xem phần 9.5.8) Tuy nhiên, 9.5.1 phần trên biểu tượng biên soạn có điều kiện không cho biết điều này "cho đến khi kết thúc hành vi tập tin"

Biểu tượng vẫn được xác định cho đến khi một chỉ thị #undef cho biểu tượng đó cùng được xử lý hoặc cho đến khi kết thúc tệp nguồn .

Với 'tiền xử lý' thực sự là một phần của giai đoạn phân tích từ vựng, có khả năng hành vi này là hợp đồng hiệu quả cho Microsoft và tất cả các triển khai khác trong tương lai gần. cực kỳ phức tạp và không xác định dựa trên thứ tự biên dịch tệp nguồn)

+1

Tóm lại: hành vi không được xác định vì vậy chúng tôi cần khôi phục – Julian

2

Không, bạn sẽ thấy rằng trình biên dịch sẽ tự động khôi phục bất kỳ cảnh báo bị vô hiệu hóa nào khi nó hoàn thành việc phân tích tệp nguồn.

#pragma warning disable 649 
struct MyInteropThing 
{ 
    int a; 
    int b; 
} 
#pragma warning restore 649 

Trong ví dụ trên, tôi đã cảnh báo CS00649 vì tôi định sử dụng cấu trúc này một cách không an toàn. Trình biên dịch sẽ không nhận ra rằng tôi sẽ ghi vào bộ nhớ có loại bố cục này nên tôi sẽ muốn bỏ qua cảnh báo:

Trường 'trường' không bao giờ được gán và sẽ luôn có giá trị mặc định 'value'

Nhưng tôi không muốn toàn bộ tệp không được bỏ chọn.

+0

Điều gì sẽ xảy ra nếu cảnh báo đã bị tắt bởi một đối số dòng lệnh? Bạn sẽ kết thúc việc khôi phục lại những gì bạn không nên làm. – drowa

+0

@drowa sau đó giả sử bạn không cần vô hiệu hóa ngay từ đầu. Theo tôi, không có gì tương đương với C++ push/pop trong trình biên dịch C#.Vì vậy, nó không nhận được bất kỳ tốt hơn này. –

3

Giả sử tôi có trường riêng được khởi tạo bằng phản xạ, trình biên dịch rõ ràng không thể tìm thấy bất kỳ mã nào trực tiếp viết vào trường này để nó hiển thị cảnh báo - mà tôi không muốn hiển thị. Hãy nói rằng tôi có một trường riêng khác được xác định 3 dòng bên dưới trường đầu tiên mà tôi quên khởi tạo, nếu tôi tắt cảnh báo cho toàn bộ tệp, điều này sẽ không kích hoạt cảnh báo. Vì vậy, cách sử dụng tốt nhất cho cảnh báo #pragma là đặt "cảnh báo vô hiệu hóa" ngay trước dòng gây ra cảnh báo mà tôi muốn chặn và "khôi phục cảnh báo" ngay sau dòng để điều kiện tương tự trong một vị trí khác trong tệp sẽ vẫn kích hoạt cảnh báo.

+0

Bạn đã đưa ra một trường hợp sử dụng và kết luận rằng tất cả các trường hợp sử dụng khác đều giống nhau. Hơn nữa tôi nghĩ rằng điều này nên có được một bình luận thay vì một câu trả lời. –

+1

@MichaWiedenmann - Tôi đã cố gắng giải thích bằng ví dụ, tôi có thể viết "đôi khi bạn có hai cảnh báo cùng loại trong cùng một tệp mà trong đó tệp đầu tiên là dương tính giả nhưng thứ hai là sai lầm thực" - đó có phải là tốt hơn không câu trả lời? theo ý kiến ​​của tôi không, mọi người sẽ tuyên bố rằng không có trường hợp sử dụng thực tế nào (nếu họ không dừng đọc ở "sai tích cực") – Nir

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