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.
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-
- 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.
EventHandlers'ınızı, onları ateşlemeden önce bunlarda null-çek yapmaktan kaçınmak için bu şekilde başlatıyor musunuz? –
Bu baskın sebep, evet. – Sean
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 –