2009-09-10 13 views
16

Jaka jest łączna liczba klas w .NET? Numer znajduje się w pobranym środowisku wykonawczym dla .NET 2.0, .NET 3.0 i .NET 3.5 SP1.Liczba klas w .NET?

Piszemy artykuł naukowy na temat aplikacji, która opiera się na .NET i obecnie stwierdza, że ​​jest ich więcej niż 6000 klas. Ale nie jestem pewien, czy jest to prawidłowy numer .

Na przykład this page określa liczbę złożeń, przestrzeni nazw, metod itd., Ale nie liczbę klas.

Platforma testowa: Windows XP 64-bitowy SP2, 8 GB pamięci RAM.


Update 4: Nasz papier został opublikowany! Użyłem 9911 dla liczby klas (patrz aktualizacja 3 poniżej). Czasopismo to Journal of Proteome Research, a tytuł brzmi: "MSQuant, an Open Source Platform for Mass Spectrometry-Based Quantitative Proteomics". Niestety pełny tekst artykułu nie jest swobodnie dostępny, tylko streszczenie.

Aktualizacja 3: Myślę, że bardzo zbliżyłem się do rozwiązania: 9911 klas publicznych dla .NET 3.5 SP1. Rozszerzając aktualizację 1, utworzyłem funkcję rekurencyjną i rozszerzyłem ją tak, aby liczba typów, klas i klas publicznych była zgłaszana dla dowolnego podfolderu i jego podfolderów. Uruchomienie tego w C: \ WINDOWS \ Microsoft.NET daje 40414 typów, tylko 0,2% od liczby w referenced article. Full transcript - Źródło HTML jest oddzielone tabulatorami, dzięki czemu można go zaimportować do arkusza kalkulacyjnego, np. , np. OpenOffice Calc. Oto break-down dla klas społecznych:

Framework: 

    Total: 6025 

    v1.1.4322 
     0 

    v2.0.50727 
     5265 

    v3.0 
     641 

    v3.5 
     119 

Framework64: 

    Total: 3886 

    v2.0.50727 
     3126 

    v3.0 
     641 

    v3.5 
     119 

Aktualizacja 2: Próbowałem za pomocą NDepend i CQI sugerowanego przez lextm i dała 10% wyższy numer dla .NET 2.0 (89 bibliotek DLL w Klasa C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727): 5855 . To było w innym systemie niż dla programowego rozwiązania (patrz poniżej).

Procedura:

  1. Pobierz NDepend (NDepend_2_12_1_3122.zip) poprzez http://www.ndepend.com/NDependDownload.aspx

  2. Rozpakuj z 7-Zip

  3. Run VisualNDepend.exe

  4. Menu Plik/Wybierz .NET Zespoły do ​​analizy/ < Wybrano 89 plików DLL w katalogu C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 >/< Wybrano całość >/OK.

  5. przycisk "Utwórz zapytanie" (prawy dolny) i typ/wklej:

    wybrać typy kompletów "dostępność", "cscompmgd", "CustomMarshalers", "IEExecRemote", "IEHost", "IIEHost" , "ISymWrapper", "Microsoft.Build.Engine "," Microsoft.Build.Framework "," Microsoft.Build.Tasks "," Microsoft.Build.Utilities "," Microsoft.JScript "," Microsoft.VisualBasic "," Microsoft.VisualBasic.Compatibility "," Microsoft. VisualBasic.Compatibility.Data "," Microsoft.VisualBasic.Vsa "," Microsoft.VisualC "," Microsoft.Vsa "," Microsoft.Vsa.Vb.CodeDOMProcessor "," Microsoft_VsaVb "," mscorlib "," sysglobl "," System "," System.configuration "," System.Configuration.Install "," System.Data "," System.Data.OracleClient "," System.Data.SqlXml "," System.Deployment "," System.Design " , "System.DirectoryServices", "System.DirectoryServices.Protocols", "System.Drawing", "System.Drawing.Design", "System.EnterpriseServices", "System.Management", "System.Messaging", "System. Runtime.Remoting "," System.Runtime.Serialization.Formatters.Soap "," System.Security "," System.ServiceProcess "," System.Transactions "," System.Web "," System.Web.Mobile "," System.Web.RegularExpressions "," System.Web.Services "," System.Windows.Forms "," System.XML "WHERE IsPublic I IsClass


Update 1: na podstawie odpowiedzi Jon Skeet za I opracowali funkcji (lista poniżej). Wstępny wynik to 5265 klas publicznych, 12626 klas łącznie, 18317 typów dla .NET 2.0. 802 klas publicznych z mscorlib.dll i 678 publicznych klas z System.dll. Jest to z 89 plików DLL, z których 40 kończy się niepowodzeniem z Assembly.LoadFrom(). Ale nie jestem pewien, czy zmierzyłem właściwą rzecz lub we właściwym miejscu.

Call:

DotNetClassCount("C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727") 

Funkcja:

Imports System.Reflection 'For Assembly 
Imports System.IO 'For Path 

Private Function DotNetClassCount(ByRef aBaseDirectory As String) _ 
    As Integer 

    Dim classCount As Integer = 0 

    Dim failCount As Integer = 0 'For statistics only. 

    Dim folderItems As String() = Directory.GetFiles(aBaseDirectory) 
    Dim someFolderItem As String 
    For Each someFolderItem In folderItems 

     Dim fileName As String = Path.GetFileName(someFolderItem) 

     If Path.GetExtension(fileName) = ".dll" Then 
      Try 
       Dim asm3 As Assembly = _ 
        Assembly.LoadFrom(someFolderItem) 
       Dim types As System.Type() = asm3.GetTypes() 

       Dim DLLclassCount As Integer = 0 
       Dim someType As System.Type 
       For Each someType In types 
        If someType.IsClass AndAlso someType.IsPublic Then 
         DLLclassCount += 1 
        End If 
       Next 
       classCount += DLLclassCount 
      Catch ex As Exception 
       'Fail silently... 
       failCount += 1 
      End Try 
     End If 
    Next 
    Return classCount 
End Function 'DotNetClassCount() 
+0

zależności jak liczyć kod prywatny i wewnętrzne, a także enums, structs i interfaces, liczba może się bardzo różnić. – Lucero

+0

Istnieje również blok iteratora, anonimowe klasy i zamknięcia, które mogą powodować tworzenie kilku klas utworzonych przez kompilator - tak więc patrzenie na zajęcia niepubliczne jest prawdopodobnie mniej znaczące. Następnie prawdopodobnie istnieją różne klasy generowane maszynowo przy użyciu technik takich jak T4, które często zawierają bardzo podobne zachowania, ale kończą na odrębnych klasach. Api, które działają za pomocą metod fabrycznych, może ukryć kilka odpowiednich klas, ujawniając głównie tylko interfejsy - interfejs może nie mieć publicznych implementatorów, ale nadal może być użyteczny. W sumie trudny do zmierzenia ... –

+0

Proponuję użyć zestawu.ReflectionOnlyLoadFrom zamiast Assembly.LoadFrom, tylko ze względu na szybkość naprawdę. –

Odpowiedz

16

że strona daje liczbę typów (40513 w 3.5SP1) - czy to naprawdę dla Ciebie ważne, aby rozróżniać między klasami i strukturach/teksty stałe/interfejsy?

Spodziewałbym się, że zdecydowana większość z tych 40K + będzie klasami, więc Twoja liczba 6000 jest bardzo konserwatywna.

otrzymali listę zespołów, to bardzo łatwo wypracować szereg zajęć:

int classes = assemblies.GetTypes() 
         .Where(t => t.IsClass) 
         .Count(); 

zakłada to chcesz wszystkie klas chociaż - czy jesteś rzeczywiście zainteresowany tylko w klasach publicznych?

int classes = assemblies.GetTypes() 
         .Where(t => t.IsClass && t.IsPublic) 
         .Count(); 
+4

+1 "bardzo konserwatywny" w istocie :) –

+0

Czy lista złożeń pochodzi z 89 plików DLL? w C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727? (Dla .NET 2.0 w moim systemie) –

+0

Może być - dla .NET 2.0. Wygląda na to, że zmienia się dla każdej wersji. Katalog "Reference Assemblies" jest obiecujący, ale dla v3.5, który pomija mscorlib.dll i System.dll ... –

Powiązane problemy