Aktualizacja: Dzieje się tak wtedy, gdy opcja Code Analysis „Pomija wyniki z wygenerowanego kodu zarządzanego (tylko)” jest wyłączona, a Rule Set jest ustawiona na „Microsoft Basic Design Rules wytyczna”.Dlaczego pusty eventowy program obsługi zdarzenia powoduje ostrzeżenie CA1061?
dniu 2013-04-26 Microsoft potwierdziła, że jest to błąd, ale nie będzie go naprawić albo w tej lub następnej wersji programu Visual Studio.
Często zainicjować obsługi zdarzeń z pustym delegata w celu uniknięcia konieczności sprawdzania wartości null. Np .:
public EventHandler SomeEvent = delegate {};
Jednakże, ponieważ zaczynają się skompilować niektóre z naszego kodu w Visual Studio 2012 (RTM), ja zauważyć wiele wydarzeń w klasach pochodnych są teraz wyzwalanie CA1601: Do not hide base class methods ostrzeżenia w Visual Studio Code Analysis 2012 roku.
Oto próbka że wywoła ostrzeżenie:
using System;
using System.ComponentModel;
[assembly: CLSCompliant(true)]
namespace TestLibrary1
{
public abstract class Class1
{
public event PropertyChangedEventHandler PropertyChanged = delegate {};
}
public class Class2 : Class1
{
// this will cause a CA1061 warning
public event EventHandler SelectionCancelled = delegate { };
}
public class Class3 : Class1
{
// this will not cause a CA1061 warning
public event EventHandler SelectionCancelled;
}
}
Uwaga: W VS2012 ostrzeżenie jest wyzwalany, gdy zestawione w .NET 4.5 lub .NET 4.0. Ta sama próbka nie wyzwala ostrzeżenia w VS2010.
Pomijając przyczyny wykonania, Czy istnieją uzasadnione powody, dla których nie powinniśmy inicjować zdarzeń z pustymi uczestnikami? Domyślna założeniem jest to, że prawdopodobnie tylko dziwactwo w analizie w Visual Studio 2012.
oto wynik analizy kodu dla tych, którzy nie mają dostępu do VS2012 jeszcze:
CA1061 nie ukrywają metody klasy bazowej Zmień lub usuń "Class2.Class2()", ponieważ ukrywa ona bardziej szczegółową metodę klasy bazowej: "Class1.Class1()". TestLibrary1 Class1.cs 14
Uzupełnienie: Okazało się, że opcja „Pomija wyniki z wygenerowany kod” w analizie kodu jest wyłączony.
Ponadto, stwierdziliśmy, że to wydaje się występować, gdy obsługi zdarzeń w typie bazowym jest zarówno:
- delegatem inny niż eventhandler lub eventhandler -i-
- wydarzeń zarówno w klasie bazowej i klasa pochodna jest inicjowana przy użyciu metody anonimowej lub pustego delegata (inline lub in constructor).
Możliwe znaczenie: uruchamiamy program Visual Studio 2012 RTM, który został zainstalowany na miejscu przez kandydata wersji.
Czy inicjalizujesz swoje EventHandlers w ten sposób, aby uniknąć konieczności sprawdzania null przed ich uruchomieniem? –
To jest główny powód, tak. – Sean
Wydaje mi się, że jestem dziwactwem VS 2012. Jeśli nadpisałeś delegata w klasie bazowej, mógłbym go zobaczyć, ale w jego obecnej postaci nie wygląda on tak, jakby pasował do opisu CA1061: http : //msdn.microsoft.com/en-us/library/ms182143.aspx –