C # - Ngăn chặn có chọn lọc các cảnh báo lỗi thời tùy chỉnh


212

Tôi đang sử dụng Obsoletethuộc tính (như được đề xuất bởi các lập trình viên đồng nghiệp) để hiển thị cảnh báo nếu một phương thức nhất định được sử dụng.

Có cách nào để loại bỏ cảnh báo tương tự như CodeAnalysis ' SuppressMessagetại các điểm mà việc sử dụng là hợp lý không?

Cảm ơn bạn!

BIÊN TẬP

Đây là [Obsolete("Some message")]vì tôi cần bao gồm một số chi tiết về cảnh báo. Tuy nhiên, #pragma warning disable 612không hoạt động nữa khi tôi thêm thông báo vào [Obsolete]thuộc tính trần trụi ...

CHỈNH SỬA 2

Tìm thấy số cảnh báo đúng - Đó là 618 nếu bạn có một thông báo theo thuộc tính lỗi thời.

Vì vậy, để làm những gì tôi muốn làm:

#pragma warning disable 618

và sau cuộc gọi

#pragma warning restore 618

Cảm ơn Jared Par và Jon Skeet đã chỉ cho tôi đi đúng hướng!

Câu trả lời:


257

Sử dụng #pragma warning disable:

using System;

class Test
{
    [Obsolete("Message")]
    static void Foo(string x)
    {
    }

    static void Main(string[] args)
    {
#pragma warning disable 0618
        // This one is okay
        Foo("Good");
#pragma warning restore 0618

        // This call is bad
        Foo("Bad");
    }
}

Khôi phục cảnh báo sau đó để bạn không bỏ lỡ các cuộc gọi "xấu".


1
Điều này chỉ hoạt động nếu tôi không đưa ra một thông báo với thuộc tính Lỗi thời của mình. Tôi có một thông báo như thế này: [Lỗi thời ("Đây là lý do tại sao điều này không nên được sử dụng - thay vào đó hãy sử dụng XYZ.")]. Khi tôi đặt tin nhắn vào, cảnh báo pragma vô hiệu hóa 612 dừng hoạt động và tôi nhận được cảnh báo bất kể. Tôi có cần một ID lỗi khác thay thế không?
Alex

2
Đã tìm thấy - Số cảnh báo chính xác là 618 nếu có thông báo trong thuộc tính Lỗi thời. Cảm ơn bạn!
Alex

2
Goodo - Tôi đã điều chỉnh ví dụ của mình để phù hợp với điều này.
Jon Skeet

6
@George: Bạn có thể tìm thấy chúng ở đây .
Jordão

3
Xem câu trả lời của tôi về cách nhận số cảnh báo / lỗi ở vị trí đầu tiên.
Aaron Thoma

130

Các ý định là để vô hiệu hóa các cảnh báo cho lỗi thời sử dụng , bất kể cấu trúc được đánh dấu bằng [Obsolete]hoặc [Obsolete("Message")]. Vì vậy, sử dụng cả CS0612 CS0618 :

#pragma warning disable 612, 618 

...

#pragma warning restore 612, 618 

3
Cũng lưu ý rằng các cảnh báo không xảy ra nếu việc sử dụng lỗi thời nằm trong một lớp được đánh dấu là lỗi thời.
redcalx

3
Có cách nào để vô hiệu hóa một lỗi không, trong trường hợp Obsoleteđược đánh dấu là một lỗi?
Shimmy Weitzhandler

2
@Shimmy: nếu nó được đánh dấu là lỗi, thì bạn phải sửa nó, không có cách nào để khắc phục lỗi. Đây có thể là một vấn đề cú pháp, đăng nó dưới dạng câu hỏi trên trang web này và chắc chắn bạn sẽ nhận được câu trả lời tốt.
Jordão

18

Đây là cách nhận số cảnh báo / lỗi ở vị trí đầu tiên:

  1. Tái tạo dự án của bạn.
  2. Đi đến cửa sổ đầu ra .
  3. Tra cứu dòng cảnh báo / lỗi bạn muốn loại bỏ.
    Ví dụ:
    C:\Users\Username\Documents\Visual Studio 2010\Projects\Projectname\Classname.cs(203,7): warning CS0162: Unreachable code detected
  4. Sao chép phần số sau " CS".
  5. Sau đó tiến hành như Jon Skeet nói .

(Tốt hơn là luôn luôn tiến hành như Jon Skeet nói rằng)


9

Bạn đang tìm kiếm #pragmachỉ thị vô hiệu hóa cảnh báo

Về cơ bản, bạn thêm lệnh sau bên trên trang web cuộc gọi trong tệp .cs.

#pragma warning disable 612
SomeMethodCall

612 là ID thông báo lỗi khi gọi các phương thức lỗi thời


Điều này chỉ hoạt động nếu tôi không đưa ra một thông báo với thuộc tính Lỗi thời của mình. Tôi có một thông báo như thế này: [Lỗi thời ("Đây là lý do tại sao điều này không nên được sử dụng - thay vào đó hãy sử dụng XYZ.")]. Khi tôi đặt tin nhắn vào, cảnh báo pragma vô hiệu hóa 612 dừng hoạt động và tôi nhận được cảnh báo bất kể. Tôi có cần một ID lỗi khác thay thế không?
Alex

2
Đã tìm thấy - Số cảnh báo chính xác là 618 nếu có thông báo trong thuộc tính Lỗi thời.
Alex
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.