2011-04-20 28 views
8

SadeceC#: Bulma Hatalar:

bool first = true; 

foreach (RdAbstractNode node in listNodes) 
{ 
    if (!first) 
    { 
     // do stuff (does not change first) 
    } 
    // do more stuff (does not change first) 
} 

sen first görebileceğiniz gibi (bazı hata ayıklama miktarına ve yırtılma saçım sonra) benim programda bir hata buldum (yanlış) ise her zaman true olduğunu - hiçbir zaman değişti. Yani if(!first) temel olarak if(false)'dur.
Derleyici, 4. düzey (en yüksek düzey) olarak ayarlanmış olmasına rağmen bir uyarı oluşturmadı.

Benzer if(false) hataları nasıl bulabilirim? Ben VS 2010 kullanıyorum

, .Net 4.0 derleyici, proje .Net 2.0

+2

'// şeyler '' '' ilk şeyler' 'çevirebilecek bir şey yapabilirdi ama ben her zaman yanlış veya doğru olan şeyler hakkında Resharper gösterisi uyarıları gördük. –

+0

ya da daha çok, '// daha fazla şeyler yap', değişkeni tersine çeviren tek olmalı. – cdeszaq

cevap

13

bu

enter image description here

+1

+1 Resharper'ı tavsiye etmek için. Bazıları için pahalı bir eklenti, ancak bunun gibi örneklerde paha biçilemez. – Pretzel

+0

Ücretsiz bir şey var mı yoksa sadece akademik lisans için 42 € harcamak zorunda mıyım? –

+0

@Pretzel: "Değersiz" bir esnektir. – jason

10

sana yardımcı olacak bir derleyici özelliğinin bilmiyorum ayarı - Eğer birim testleri gerekir. örneğin - Resharper ile

+0

Derleyici, atanmamış değişkenler hakkında uyarı veriyor. Bir değişkenin sabit bir değere sahip olup olmadığını bilir. Ancak, '(false) ' –

+0

@Simon Ottenhaus hakkında uyarıda bulunmaz: Atanmamış değişkenler, sahip olduğunuzdan çok farklıdır. – jason

+0

İçinde kodlu bir if (yanlış) bloğum varsa bir derleme uyarısı alıyorum. İçinde sadece bir yorum varsa, derleyici bir uyarı olmadan bloğu en iyi duruma getiriyor gibi görünüyor. @dahlbyk ile aynı fikirdeyim: muhtemelen kod kapsamı analizini veya statik analiz cihazını kullanmak istersiniz. Bunun neden bir uyarı olmadığını bilmek istiyorsanız, bu makale yardımcı olabilir: http://blogs.msdn.com/b/ericlippert/archive/2011/03/03/danger-will-robinson.aspx – mcw0933

0

gibi uyarılar alırsınız derleyici if ifadesi içinde sabit bir değere dayalı ulaşılamaz kodu gibi bariz şeylerin sizi uyaracaktır "eğer (yanlış)". Ancak, değişken değiştirilebileceği için bu durumda maalesef olmaz.

1

Resharper'ın sahip olmak için iyi bir araç olduğunu kabul ediyorum, ancak bu yapıyı kullanmamanın bir nedeni olduğunu düşünüyorum.

bir alternatif olabilir:

DÜZENLEME:

//.net 4.0 
    var firstNode = listNodes.First(); 
     //do something special for first. 

    foreach(var node in listNodes.Skip(1)) 
    { 
     //do something for the rest. 
    } 

//.net 2.0 
using (IEnumerator<RdAbstractNode> enumerator = listNodes.GetEnumerator();) 
{ 
    if (!enumerator.MoveNext()) 
     return; 

    RdAbstractNode first = enumerator.Current; 
    //do something with first 
    while(enumerator.MoveNext()) 
    { 
     RdAbstractNode currentNode = enumerator.Current; 
     //do something with the node. 
    } 
} 

Genellikle bazen mantığını değiştirmek ve yapmak daha iyidir, kendimizi ilk element için özel işleme bir tür gerek bulmak tüm işlem üniforması. Eğer yapamayız, her zaman özel durum işlemeyi elemanların geri kalanından yuvalamak yerine açıkça ayırmayı tercih ederim.

+0

.Net 2.0: Hayır Atla (1) –

+0

mm..şimdi - ama uzun (er) yolu yapılabilir: 'var enumerator = listNodes.GetEnumerator(); enumerator.MoveNext(); var first = enumerator.Current; (enumerator.MoveNext()) // enumerator ile bir şeyler yapın.Current } ' – NightDweller

+0

'IEnumerator ' un atılması gerektiğini unutmayın. Ve eğer uygunsa, 'false' döndüren ilk' MoveNext() 'çağrısını kullanmalısınız. – dahlbyk