2012-08-16 7 views
17

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.

Link to MS Connect item

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.

+0

Czy inicjalizujesz swoje EventHandlers w ten sposób, aby uniknąć konieczności sprawdzania null przed ich uruchomieniem? –

+0

To jest główny powód, tak. – Sean

+0

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 –

Odpowiedz

4

Problem polega na tym, że kompilator języka C# generuje statyczny element delegujący używany do inicjowania delegata instancji, który ma taką samą nazwę dla klasy 1 i klasy2.

Class1.CS$<>9__CachedAnonymousMethodDelegate1 istnieje do użytku przez konstruktora Klasa1 za zainicjowanie PropertyCancelled, natomiast Class2.CS$<>9__CachedAnonymousMethodDelegate1_ istnieje do użytku przez konstruktora class2 za zainicjowanie SelectionCancelled.

To niefortunne, że kompilator C# nie zawiera jakiegoś rekordu "automatycznie generowanych" materiałów klasy nadrzędnej przy podejmowaniu decyzji o nadaniu nazwom generowanym automatycznie "stuff" dla klasy potomnej. Rozwiąż to otwarcie w ILDasmie, a problem staje się natychmiast oczywisty. Dobrze wiedzieć, że znalazłeś pracę. Ostrzeżenie jest całkowicie uzasadnione, aby zignorować, ponieważ nie można dotykać statycznych delegatów z C#, dzięki nie nazewnictwu zgodnemu z C#.

+1

To z pewnością racjonalne wytłumaczenie tego, co się dzieje, ale nie wyjaśnia, dlaczego zaczęło się od najnowszej wersji Visual Studio. Jednak w ubiegłym tygodniu znalazłem wiele innych osobliwości w Analizy kodu, wszystkie dotyczące anonimowych metod związanych z procedurami obsługi zdarzeń i zapytaniami LINQ, więc dziękuję za wgląd. – Sean

Powiązane problemy