2012-04-20 10 views
8

Biz sortof, bu kodu vardır: VS10 Ultimate13 olay işleyicisi aboneliği olan bir yöntemde siklizik karmaşıklık 27 nasıl olabilir?

private void InitializeEvents() 
{ 
    this.Event1 += (s,e) => { }; 
    this.Event2 += (s,e) => { }; 
    this.Event3 += (s,e) => { }; 
    this.Event4 += (s,e) => { }; 
    this.Event5 += (s,e) => { }; 
    this.Event6 += (s,e) => { }; 
    this.Event7 += (s,e) => { }; 
    this.Event8 += (s,e) => { }; 
    this.Event9 += (s,e) => { }; 
    this.Event10 += (s,e) => { }; 
    this.Event11 += (s,e) => { }; 
    this.Event12 += (s,e) => { }; 
    this.Event13 += (s,e) => { }; 
} 

Kod analizi "27 cyclomatic karmaşıklığını" diyor. satırlardan birini cyclomatic karmaşıklık 25.

var oluyor yapar Çıkarma hiçbir oluyor dallanma, bu yüzden bu nasıl mümkün olabilir?

cevap

17

Unutmayın! Değil kaynak kodu. IL'de, lambda ifadelerini doğal olarak destekleyen hiçbir şey yoktur, bu yüzden derleyicinin bir yapısıdır. Ouput here'un ayrıntılarını bulabilirsiniz. Ama temel olarak, lambda ifadeniz, anonim bir delil olan özel bir statik sınıfa dönüştürülür. Ancak, kodda her başvurulduğunda anonim bir delginin örneğini oluşturmak yerine, söz konusu önbellek önbelleğe alınır. Yani, bir lambda ifadesi her atadığınızda, bu lambda deligatının bir örneğinin, önbelleğe alınmış deligatı kullanması durumunda oluşturulduğunu görmek için bir kontrol yapar. 2 ile artan karmaşıklık/başka bir IL eğer bu yüzden, bu fonksiyonlar karmaşıklığı 1 + 2 * (lamda ekspres) = 1 + 2 * (13) = doğru sayıda 27 olan bir oluşturur.

+0

+1 için "Kod Analizinin kaynak kodunuzda değil, derlemenizde IL'ye baktığını unutmayın. IL'de lambda ifadelerini doğal olarak destekleyen hiçbir şey yok" – Lijo

+0

Kepçeler/delegeler SADECE KAPALI ise onların üstünde. Aksi halde değiller. Bu lambdaların bir sebebi (birkaç) pahalıdır. JIT, tahsis ve GC de var - ama başka bir tartışma için. Ben sayabileceğim "sıcak" yöntemlerle lambdalar ile ilgili daha fazla performans sorunları sabitledim. –

1

En iyi tahmin olay erişimci biçimine tartışmalar için http://msdn.microsoft.com/en-us/magazine/cc163533.aspx ve http://www.switchonthecode.com/tutorials/csharp-tutorial-event-accessors Bkz

class MyClass 
{ 
    private event EventHandler MyPrivateEvent; 

    public event EventHandler MyEvent 
    { 
    add 
    { 
     MyPrivateEvent += value; 
    } 
    remove 
    { 
     MyPrivateEvent -= value; 
    } 
    } 
} 

yani, bu muhtemelen olay erişimci formatına dönüştürülmeden yukarıdaki ifadeleri nedeniyle olmasıdır. Kod Analizi, derlemede IL bakıyor

3

C# derleyicisi aslında lambdas dahil anonim yöntemleri için bazı oldukça "ilginç" IL üretir. Her biri için, değerin derlenmiş yöntemine ise şube katan, null ise alıcı yönteminde değerini atamadan önce, bu denetler, ardından özel bir alan oluşturur. Kod ölçülerine aracı (http://social.msdn.microsoft.com/Forums/eu/vstscode/thread/8c17f569-5ee3-4d26-bf09-4ad4f9289705, https://connect.microsoft.com/VisualStudio/feedback/details/555560/method-using-many-lambda-expressions-causes-high-cyclomatic-complexity) bu görmezden gerektiğini ve biz umut edebiliriz sonunda olacak o . Şimdilik, yanlış bir pozitif olduğunu düşünüyorsanız, bu problemi görmezden gelmek zorundasınız.

İlgili konular