Lambdalarla listenin başlatılması, yüksek IL siklizik karmaşıklığına neden olur: neden ve bu karmaşıklığı nasıl kaldırırsınız? Örneğin, aşağıdaki kod, sınıfın statik oluşturucusunun (aslında derleyicinin oluşturduğu) çok karmaşık olmasını sağlar: 1 + liste sayısı.Listenin lambda ile başlatılması neden yüksek çevrimsel karmaşıklığa neden oluyor?
static List<Predicate<string>> list = new List<Predicate<string>>()
{
s => s == null,
s=> s.StartsWith(“R”),
... With a lot of predicates like that ….
};
Not: karmaşıklığı NDepend
Aslında kodu koda dönüştürürsem ve iyi bir şekilde anladığımda IL (bu konuda bir kuklaım), lambdalar ayrı olarak oluşturulmuş gibi görünüyor. Dallar, derleyici kod nesnesinin bir eseri gibi görünüyor. – sthiers
Belki de VS'ye koşmak için çok tembel olan, decompiled IL'nin kısa bir özünü ekleyebilirsiniz. Lambacılar statik yapıcı karmaşıklığına doğru saymak için statik başlatma noktasında gerçekte üretilmezse şaşırdım. –
L_0008: ldsfld sınıfı Predicate'1 Foo.Class1 :: CS $ <> 9__CachedAnonymousMethodDelegate12 L_000d: ldnull L_0010: ldftn bool Foo.Class1 :: b__0 (dize) L_0016: newobj örneği L_0022 L_000f brtrue.s . stsfld sınıfı [mscorlib] Predicate'1 Foo.Class1 :: CS $ <> 9__CachedAnonymousMethodDelegate12 L_0020: L_0022 L_0022 gn [mscorlib] Predicate'1 :: ctor (nesne, yerli int) L_001b geçersiz: ldsfld sınıfı Predicate'1 Foo.Class1 :: CS $ <> 9__CachedAnonymousMethodDelegate12 L_0027: callvirt instance void GenelerikList'1 > :: Ekle (! 0) –
sthiers