Visual Studio에서 "[일부 이벤트] 사용하지 않음"컴파일러 경고를 제거하려면 어떻게합니까?


93

예를 들어이 컴파일러 경고가 표시됩니다.

'Company.SomeControl.SearchClick'이벤트는 사용되지 않습니다.

그러나 주석을 달면이 이벤트를 사용하려는 XAML 페이지에 대한 20 개의 새로운 경고가 발생하기 때문에 사용된다는 것을 알고 있습니다!

무엇을 제공합니까? 이 경고를 제거하는 트릭이 있습니까?


1
예제를 게시 해 주시겠습니까?
John Saunders

답변:


145

이것은 경고 67로 보이 므로 다음을 사용하여 억제 할 수 있습니다.

#pragma warning disable 67

다음을 사용하여 가능한 한 빨리 (이벤트 선언 후) 복원하는 것을 잊지 마십시오.

#pragma warning restore 67

그러나 다시 확인 하고 이벤트를 구독 하는 것이 아니라 어딘가에서 이벤트를 제기 하고 있는지 확인 합니다. 컴파일러 가 이벤트를 주석 처리 할 때 20 개의 오류 가 아니라 20 개의 경고를 내 보낸다는 사실 도 의심 스럽습니다.

이 경고와 특히 인터페이스에 적용되는 방법에 대한 흥미로운 기사 도 있습니다. "사용하지 않는"이벤트를 처리하는 방법에 대한 좋은 제안이 있습니다. 중요한 부분은 다음과 같습니다.

정답은 이벤트에서 기대하는 바를 명시하는 것입니다.이 경우에는 아무것도 아닙니다.

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

이렇게하면 경고는 물론 일반 이벤트의 추가 컴파일러 생성 구현이 표시되지 않습니다. 그리고 또 다른 추가적인 이점으로, 이것은 아무것도하지 않는 구현이 실제로 최상의 구현인지에 대해 생각하게합니다. 예를 들어 이벤트가 지원되지 않기 때문에 그다지 중요하지 않아서 기능에 의존하는 클라이언트가 이벤트없이 실패 할 가능성이있는 경우 지원 부족을 명시 적으로 표시하고 빠르게 실패 할 수 있습니다. 예외:

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

물론 기능의 일부없이 유용하게 구현할 수있는 인터페이스는 인터페이스가 최적으로 응집되지 않고 별도의 인터페이스로 분할되어야 함을 나타내는 경우가 있습니다.


그게 바로 내가 필요한 것입니다! 감사합니다! 유일한 차이점은 67 번 옆에 내 자신의 의견을 추가하여 미래에 대해 알 수 있다는 것입니다. 입력 한 내용은 "정확히"입니다 ... #pragma warning disable 67 // 이벤트는 public event를 사용하지 않았습니다. RoutedEventHandler SearchClick; #pragma warning restore 67
jedmao

12
훌륭한 링크입니다. 감사.
Max Palmer

이것은 유용합니다. ... 장소에 보관하려고하지만, 뭔가가 현재의 아이디어 실행을 얻을 수 없습니다
dudeNumber4

78

인터페이스에서 이벤트를 구현해야하는 경우 구현에 필요하지 않은 경우 경고를 피하기 위해 다음을 수행 할 수 있습니다.

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

이렇게하면 나중에 파일에 if(OnCompleteOpenEvent != null) OnCompleteOpenEvent();"OnCompleteEvent가 현재 컨텍스트에 존재하지 않습니다"라고 표시됩니다.
Almo 2014

@Almo, 맞습니다. 그러나 이벤트를 사용하는 경우를 설명하고 있으므로 경고가 표시되지 않으므로 경고에 대한 수정을 사용하지 않습니다. 권리? 일반적으로 이벤트와 두 개의 하위 클래스를 지정하는 인터페이스가 있습니다. 하나는 이벤트를 사용하지 않고이 솔루션을 사용합니다. 다른 하나는 이벤트를 사용하고 시작하기 위해 경고를 던지지 않았습니다.
Dirk Bester 2014 년

너무 오래되었지만 사용 중임에도이 오류가 발생했습니다. 컴파일러가 사용되지 않는다고 생각하도록 속이는 방식으로 정의되는 것과 관련이 있습니다.
Almo 2014-08-21

매우 미친 상황에 대한이 쉬운 해결책에 대해 대단히 감사합니다!
M463 2017-10-26

16

두 번째로 좋은 방법은 누군가가 구독을 시도하면 예외를 발생시켜 이벤트가 지원되지 않음을 명확하게 알리는 imho입니다.

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

이에 대한 변형으로 addremove메서드를 비워 두어 이벤트에 대한 구독을 자동으로 무시할 수도 있습니다.

가장 좋은 해결책은 코드를 리팩토링하는 것입니다. 가능하면 이벤트 선언을 구현 자에게 가져 오는 것입니다.

최후의 수단으로 다음과 같이 경고를 비활성화 할 수도 있습니다.

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

나는 여기에 관련이 얼마나 널 개체를 볼 수 없습니다
vidstige

null 객체가 무엇인지 알고 있으며이 사용 사례는 마지막 단락에서 다룹니다. 전체 답변을주의 깊게 읽으십시오.
vidstige

나는 널 객체가 무엇인지 압니다. 이 사용 사례는 마지막 단락에서 다룬다 고 생각합니다.
vidstige

3

다음을 수행 할 수도 있습니다.

public event EventHandler MyEvent = delegate {}

1

컴파일러는 XAML 코드에서 사용되고 있음을 분명히 인식하지 못합니다. 이벤트 정의에서 경고를 억제하십시오.

또한 실제로 어딘가에서 이벤트를 제기하고 있는지 확인하십시오.


저도 그렇게 생각했기 때문에 XAML 코드를 뒤에있는 코드로 옮기고 동일한 경고를 표시했습니다! 그리고 예, 저는 그 행사가 어딘가에서 일어나고 있다고 100 % 확신합니다. 나는 그것을 바로보고있다. 버튼에 연결되어 있습니다.
jedmao

1

개별 경고를 억제 할 수 있습니다.

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

이 경우 CS0219는 할당되었지만 사용되지 않는 변수에 대한 경고입니다. / nowarn : 0219 플래그를 사용하거나 프로젝트의 속성 창에 오류 번호를 추가 할 수 있습니다 ( "Build"아래에서 선행 CS를 제거해야 함). 이 클래스의 모든 경고를 억제 합니다 .


1

또는 <NoWarn>67</NoWarn>프로젝트에 추가 할 수 있습니다.

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

9
이렇게하면 전체 프로젝트에서 경고가 비활성화되어 사용되지 않는 이벤트와 관련된 실제 문제를 숨길 수 있습니다.
vidstige 2013-12-05
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.