Làm cách nào để loại bỏ cảnh báo trình biên dịch “[some event] never used” trong Visual Studio?


93

Ví dụ: tôi nhận được cảnh báo trình biên dịch này,

Sự kiện 'Company.SomeControl.SearchClick' không bao giờ được sử dụng.

Nhưng tôi biết rằng nó đã được sử dụng bởi vì bình luận nó ném cho tôi 20 cảnh báo mới về các trang XAML đang cố gắng sử dụng sự kiện này!

Đưa cái gì? Có một mẹo nào để thoát khỏi cảnh báo này không?


1
Bạn có thể vui lòng đăng một ví dụ?
John Saunders

Câu trả lời:


143

Điều này dường như là cảnh báo 67 và do đó có thể được ngăn chặn bằng:

#pragma warning disable 67

Đừng quên khôi phục nó càng sớm càng tốt (sau khi khai báo sự kiện) với:

#pragma warning restore 67

Tuy nhiên, tôi sẽ kiểm tra lại và đảm bảo rằng bạn đang nâng cao sự kiện ở đâu đó, không chỉ đăng ký tham gia. Việc trình biên dịch đưa ra 20 cảnh báo chứ không phải 20 lỗi khi bạn nhận xét sự kiện cũng đáng ngờ ...

Cũng có một bài báo thú vị về cảnh báo này và cụ thể cách nó áp dụng cho các giao diện; có một gợi ý hay về cách đối phó với các sự kiện "không sử dụng". Các phần quan trọng là:

Câu trả lời đúng là phải rõ ràng về những gì bạn mong đợi từ sự kiện, mà trong trường hợp này, không là gì:

public event EventHandler Unimportant
{
    add { }
    remove { }
}

Điều này sẽ ngăn chặn rõ ràng cảnh báo, cũng như việc triển khai thêm do trình biên dịch tạo ra của một sự kiện bình thường. Và như một lợi ích bổ sung khác, nó khiến người ta phải suy nghĩ về việc triển khai không làm gì này có thực sự là cách triển khai tốt nhất hay không. Ví dụ: nếu sự kiện không quá quan trọng vì nó không được hỗ trợ, chẳng hạn như các khách hàng dựa vào chức năng có thể gặp lỗi nếu không có nó, tốt hơn là nên chỉ ra rõ ràng sự thiếu hỗ trợ và thất bại nhanh chóng bằng cách ném một ngoại lệ:

public event EventHandler Unsupported
{
    add { throw new NotSupportedException(); }
    remove { }
}

Tất nhiên, một giao diện có thể được triển khai hữu ích mà không có một số phần chức năng của nó đôi khi là một dấu hiệu cho thấy giao diện đó không được gắn kết một cách tối ưu và nên được chia thành các giao diện riêng biệt.


Đó chính xác là những gì tôi cần! Cảm ơn bạn! Sự khác biệt duy nhất là tôi đã thêm nhận xét của riêng tôi bên cạnh 67 để tôi biết nó là gì trong tương lai. Đây là "chính xác" những gì tôi đã nhập ... #pragma warning disable 67 // event never used public event RoutedEventHandler SearchClick; #pragma
Warning

12
Đó là một liên kết tuyệt vời. Cảm ơn.
Max Palmer

Điều này là hữu ích; sẽ không giữ nguyên vị trí, mà chỉ là một thứ để ý tưởng hiện tại chạy ...
dudeNumber 4

78

Nếu bạn buộc phải triển khai một sự kiện từ một giao diện mà việc triển khai của bạn không cần, bạn có thể thực hiện những việc sau để tránh cảnh báo.

public event EventHandler CanExecuteChanged { add{} remove{} }

Nếu tôi làm điều này, sau đó trong tệp nơi tôi thực hiện thông báo if(OnCompleteOpenEvent != null) OnCompleteOpenEvent();rằng "OnCompleteEvent không tồn tại trong ngữ cảnh hiện tại".
Almo

@Almo, chính xác. Tuy nhiên, bạn đang mô tả trường hợp bạn đang sử dụng sự kiện và do đó cảnh báo sẽ không hiển thị, vì vậy bạn sẽ không sử dụng bản sửa lỗi cho cảnh báo. Đúng? Thông thường, bạn có một giao diện chỉ định sự kiện và hai lớp con. Một người không sử dụng sự kiện và sử dụng giải pháp này. Người kia sử dụng sự kiện và không bao giờ ném cảnh báo bắt đầu.
Dirk Bester

Đã quá lâu nhưng chúng tôi vẫn gặp lỗi này mặc dù nó đang được sử dụng. Có điều gì đó liên quan đến việc nó được định nghĩa theo cách mà người biên dịch đánh lừa rằng nó không được sử dụng.
Almo

Cảm ơn bạn rất nhiều vì giải pháp dễ dàng này cho một tình huống rất khó chịu!
M463

14

Cách tốt nhất thứ hai là imho tuyên bố rõ ràng rằng sự kiện không được hỗ trợ bằng cách ném một ngoại lệ nếu ai đó cố gắng đăng ký sự kiện đó.

public event RoutedEventHandler SearchClick
{
    add { throw new NotSupportedException(); }
    remove { throw new NotSupportedException(); }
}

Là một biến thể của điều này, bạn cũng có thể để trống phương thức addremoveđể bỏ qua các đăng ký trong sự kiện một cách im lặng.

Giải pháp tốt nhất là cấu trúc lại mã, có thể kéo phần khai báo sự kiện cho người triển khai nếu có thể.

Phương án cuối cùng, bạn cũng có thể tắt cảnh báo như vậy

#pragma warning disable 67
public event RoutedEventHandler SearchClick;
#pragma warning restore 67

Tôi không thấy như thế nào các đối tượng null có liên quan ở đây
vidstige

Tôi biết đối tượng null là gì, và trường hợp sử dụng này được đề cập trong đoạn cuối. Vui lòng đọc kỹ toàn bộ câu trả lời.
vidstige

Tôi biết đối tượng null là gì. Tôi tin rằng trường hợp sử dụng này được đề cập trong đoạn cuối cùng của tôi.
vidstige

3

Bạn cũng có thể làm như sau:

public event EventHandler MyEvent = delegate {}

1

Trình biên dịch dường như không biết rằng nó đang được sử dụng trong mã XAML. Thử loại bỏ cảnh báo trong định nghĩa sự kiện của bạn.

Ngoài ra, hãy đảm bảo rằng bạn đang thực sự nâng cao sự kiện ở đâu đó.


Đó là những gì tôi cũng nghĩ, vì vậy tôi đã chuyển mã XAML sang mã phía sau và nó hiển thị cảnh báo tương tự! Và vâng, tôi chắc chắn 100% rằng sự kiện đang được nêu ra ở đâu đó. Tôi đang nhìn vào nó. Nó được kết nối với một nút.
jedmao 07/07/09

1

Bạn có thể chèn cảnh báo riêng lẻ.

\Program.cs(13,20): warning CS0219: The variable 'foo' is assigned but its value is never used

Trong trường hợp này, CS0219 là cảnh báo liên quan đến các biến được gán nhưng không được sử dụng. Bạn có thể sử dụng cờ / nowarn: 0219 hoặc thêm số lỗi trong ngăn thuộc tính cho dự án (trong "Xây dựng", hãy nhớ xóa CS đứng đầu). Hãy ghi nhớ tất cả các cảnh báo của lớp này.


1

Hoặc bạn có thể thêm <NoWarn>67</NoWarn>vào dự án của mình

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
  ...
  <NoWarn>67</NoWarn>
</PropertyGroup>

9
điều này sẽ vô hiệu hóa cảnh báo trong toàn bộ dự án có khả năng ẩn các vấn đề thực sự với các sự kiện không sử dụng.
vidstige
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.