2010-07-13 18 views
16

ReSharper 5.0 kullanıyorum ve kod çözümleme işlevinin "İfade her zaman yanlış" olan aşağıdaki assemblies == null'u nasıl algıladığını bildiğini merak ediyorum.ReSharper bu dönüş türünün asla boş olmadığını nasıl biliyor?

var directory = new DirectoryInfo("somedir"); 
FileInfo[] assemblies = directory.GetFiles("*.dll"); 

if (assemblies == null <<--- this is highlighted with "Expression is always false" 
    || assemblies.Length == 0) 
{ 
    _log.Warn("No assemblies found"); 
} 

Dönüş türünün, bir değer türü olup olmadığını anlayamazdım. Ayrıca, bir çeşit kod sözleşmesi veya .GetFiles()'un hiçbir zaman geri dönmeyeceğini belirten meta verilerin olup olmadığını da anlarım. ama sanırım yok.

Peki bu nasıl biliyor? Açık bir şey eksik mi, yoksa ReSharper'ın çerçeve yöntemleri ile ilgili bir meta veri listesi gibi bazı ayrıcalıklı bilgiye sahip mi? Ya da aslında iç kodu "içgüdüsel olarak" ve bunu çalışır?

+2

Sadece belgelere bakmış olabilirler: "Hiçbir dosya yoksa, bu yöntem boş bir dizi döndürür." – stuartd

+11

Oh evet, onlar sadece aramayi bilmedilerHelper.ReadDocs() – heisenberg

cevap

25

ReSharper geliştiricileri, .NET framework ikili dosyalarında akış analizi yürüttü ve hangi yöntemlerin null döndüğüne veya geri dönmeyeceğine karar verdi. Görünüşe göre DirectoryInfo.GetFiles hiçbir zaman null'u döndürmez.

JetBrains. öznitelikleriyle aynı kural kümesini belirtmek için kendi kodunuzu ekleyebilirsiniz. ReSharper sitesinde bir göz atın: http://www.jetbrains.com/resharper/features/code_analysis.html#Annotated_Framework

Düzenleme: özel olarak soruyu cevaplamak için, "ReSharper böyle çerçeve yöntemleri hakkında meta bir iç listesi olarak, bazı ayrıcalıklı bilgiye sahip yok" - evet, introspecting" geldi iç kod ve çalışma "

+0

anlam ifade ediyor - Cevabınız için teşekkürler. –

+2

"Uyarı", "assemblylies == null" ifadesini kaldırmanızı önerir gibi görünüyor. Ancak, uygulanan koda bakılarak oluşturulduysa, bu, güvenmek isteyeceğim belgelenmiş bir kod sözleşmesi değildir. – intoOrbit

+0

Bu size kalmış; Eskiden Resharper'ın uyarılarını geçmişte kontrol ettim, şimdi güveniyorum. Ayrıca, tüm referans türlerinin her zaman sıfır olamayacağını garanti edemezsiniz, bu yüzden her yerde '== null' kontrolleri yerine koymak yerine onları bırakıp kodun mümkün olduğunca erken başarısız olmasına dikkat ediyorum. –

3

Tim işaret ettiğinde, .NET Framework'e açıklama ekliyoruz. Kod Sözleşmeleri ile aldığınız şeye benzer, ancak biraz farklı bir şekilde yapılır. ReSharper kurulumunda bin klasörünün altına bakarsanız, tüm ek açıklamaları görebilirsiniz.

+0

@Hadi: Lütfen bir imza bloğu kullanmaktan kaçının. Gravatar'ınız ve profilinize bir bağlantı her gönderiye zaten eklenmiş durumda. Profilinize eklemek istediğiniz tüm bilgileri eklemekte özgürsünüz. –

+0

Merak ediyorum: Bu notlar için bilgileri nasıl topladınız? Kabul edilen yanıtın önerdiği gibi BCL ikili dosyalarının statik analizini yaptınız mı? Yoksa başka bir şekilde mi gittin? –

+1

@Bill - Ben çoğunlukla sigs ile ilgili noktanız ile katılıyorum. Bununla birlikte, bu bir durumda, onun, But'un konuştuğu otoritenin altını çiziyor, çünkü o, JetBrains için çalışıyor. Muhtemelen düz İngilizce'de söylenecek fazladan bir satır daha uygun olabilirdi, ama sig, cevabını ekledi. –

İlgili konular