2012-08-16 29 views
17

Güncelleştirme: Kod Çözümleme seçeneği "Oluşturulan koddan sonuçları bastırma (yalnızca yönetilen)" devre dışı bırakıldığında ve Kural Kümesi "Microsoft Temel Tasarım Yönergesi Kuralları" olarak ayarlandığında bu oluşur.Boş bir delege olay işleyicisi neden CA1061 uyarısı veriyor?

Microsoft, bunun bir hata olduğunu doğruladı, ancak bu ya da Visual Studio'nun sonraki bir sürümünde düzeltmeyecek, 2013-04-26 tarihinde.

Link to MS Connect item

Biz sık boş değerlere kontrol gereksinimini önlemek için boş bir temsilci ile olay işleyicileri başlatmak. Örn .: Visual Studio 2012 (RTM) bizim kodun bazı derlemeye başlayan Ancak, ben şimdi Visual Studio 2012'deki kod Analizi içinde CA1601: Do not hide base class methods uyarıları tetikleyen türetilmiş sınıflara olayları çok fark ediyorum

public EventHandler SomeEvent = delegate {}; 

.

İşte uyarıyı tetikleyecek bir örnek:

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; 
    } 
} 

Not: derlenmiş zaman uyarı tetiklenir VS2012 içinde ya .NET 4.5 veya .NET 4.0. Aynı örnek VS2010'daki uyarıyı tetiklemiyor.

Performans nedenleri bir yana, Olaylar boş temsilcilerle başlatılmamamızın meşru nedenleri var mı?

CA1061 gizlemek etmeyin: varsayılan varsayım o Visual Studio İşte 2012.

yılında analizde sadece bir cilvesi henüz VS2012 için erişimi olmayan kişiler için kod analiz sonucu muhtemelen var olmasıdır Temel sınıf yöntemleri 'Class2.Class2()' değiştir veya kaldır, çünkü daha özel bir temel sınıf yöntemi gizler: 'Class1.Class1()'. TestLibrary1 Class1.cs 14

Zeyilname: Ben kodu analizinde "oluşturulan kodun sonuçlarını bastırır" seçeneği kapalı olduğunu tespit. temel sınıf ve hem eventhandler veya eventhandler -ve-

  • olaylar dışındaki

    • bir temsilci:

      Ayrıca, bundan taban tipinde olay işleyicisi hem ortaya görünmektedir bulundu türetilmiş sınıf, anonim bir yöntem veya boş bir temsilci (satır içi veya yapıcıda) kullanılarak başlatılır.

    Olası alaka düzeyi: Sürüm adayının üzerinde yerinde kurulan Visual Studio 2012 RTM'yi çalıştırıyoruz.

  • +0

    EventHandlers'ınızı, onları ateşlemeden önce bunlarda null-çek yapmaktan kaçınmak için bu şekilde başlatıyor musunuz? –

    +0

    Bu baskın sebep, evet. – Sean

    +0

    Bu bana VS 2012'nin bir tuhafı gibi gözüküyor. Baz sınıfında bir delege yazıyor olsaydınız, belki de onu görebilirdim, ama bu haliyle, CA1061'in açıklamasıyla eşleşmiyor gibi görünüyor: http : //msdn.microsoft.com/en-us/library/ms182143.aspx –

    cevap

    4

    Sorun, C# derleyicisinin, hem Class1 hem de Class2 için aynı adlı örnek temsilcisini başlatmak için kullanılan statik bir temsilci oluşturmasıdır. Class2.CS$<>9__CachedAnonymousMethodDelegate1_SelectionCancelled başlatmak için class2 en yapıcı tarafından kullanılmak üzere mevcut iken

    Class1.CS$<>9__CachedAnonymousMethodDelegate1, PropertyCancelled başlatmak için Class1'ın yapıcısı tarafından kullanılmak için vardır.

    C# derleyicisinin, bir alt sınıf için otomatik olarak oluşturulmuş 'öğelerin' nasıl adlandırılacağına karar verirken 'otomatik oluşturulan' şeyler 'ana sınıfının bir tür kaydını içermemesi talihsiz bir durumdur. Bu açık ILDasm içinde çatlak ve konu hemen belli olur. Etrafında bir iş bulduğunu bilmek güzel. C# olmayan uyumlu adlandırma sayesinde C# 'den gelen statik delegelere dokunamadığınız için uyarıyı göz ardı etmek tamamen mantıklıdır.

    +1

    Bu, olup bitenler için kesinlikle rasyonel bir açıklamadır, ancak neden yalnızca Visual Studio'nun en yeni sürümünde başlatıldığını ele almıyor. Bununla birlikte, geçen hafta içinde 2012'nin Kod Analizi'nde, olay işleyicileri ve LINQ sorgularıyla ilgili anonim yöntemlerle ilgili pek çok tuhaflık buldum, bu nedenle içgörü için teşekkürler. – Sean

    İlgili konular