2009-09-10 15 views
16

Qual è il numero totale di classi in .NET? Il numero che è nel runtime scaricato per .NET 2.0, .NET 3.0 e .NET 3.5 SP1.Numero di classi in .NET?

Stiamo scrivendo un articolo scientifico su un'applicazione che è basata su .NET e attualmente afferma che ci sono più di 6000 classi. Ma non sono sicuro che questo sia il numero corretto .

Ad esempio this page indica il numero di assiemi, spazi dei nomi, metodi, ecc., Ma non il numero di classi.

Piattaforma di test: Windows XP 64 bit SP2, 8 GB di RAM.


Update 4: La nostra carta è stato pubblicato! Ho usato 9911 per il numero di classi (vedi aggiornamento 3 di seguito). Il giornale è Journal of Proteome Research e il titolo è: "MSQuant, an Open Source Platform for Mass Spectrometry-Based Quantitative Proteomics". Sfortunatamente il testo completo dell'articolo non è disponibile liberamente, ma solo l'abstract.

Aggiornamento 3: Penso di essere arrivato molto vicino a una soluzione ora: 9911 classi pubbliche per .NET 3.5 SP1. Estendendomi all'aggiornamento 1, ho reso la funzione ricorsiva e l'ho estesa in modo tale che il numero di tipi, classi e classi pubbliche sia riportato per qualsiasi sottocartella e relative sottocartelle. L'esecuzione su C: \ WINDOWS \ Microsoft.NET restituisce 40414 tipi, solo lo 0,2% dal numero nel referenced article. Full transcript - La sorgente HTML è separata da tabulazione, quindi può essere importata in un foglio di calcolo, ad es. OpenOffice Calc. Ecco un break-down per le classi pubbliche:

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 

Update 2: Ho provato ad utilizzare NDepend e CQL suggerito da lextm e ha dato un 10% il numero più alto per .NET 2.0 (89 DLL in C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727): 5855 classi . Si trattava di un sistema diverso rispetto alla soluzione programmatica (vedi sotto).

Procedura:

  1. Scarica NDepend (NDepend_2_12_1_3122.zip), via http://www.ndepend.com/NDependDownload.aspx

  2. Unzip con 7-Zip

  3. Run VisualNDepend.exe

  4. menu File/Seleziona .NET Assemblies to Analyze/ < Selezionati i 89 file DLL in C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 >/< Selezionati tutti >/OK.

  5. Premere il tasto "Crea query" (in basso a destra) e il tipo/incolla:

    TIPI selezionare dalla ASSEMBLEE "Accessibilità", "cscompmgd", "CustomMarshalers", "IEExecRemote", "IEHost", "IIEHost" , "ISymWrapper", "Microsoft.Build.Motore "," 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 "," Sistema "," 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 E isclass


Update 1: in base alla risposta di Jon Skeet ho sviluppato una funzione (elencati di seguito). Il risultato preliminare è 5265 classi pubbliche, 12626 classi in totale, 18317 tipi per .NET 2.0. 802 classi pubbliche da classi mscorlib.dll e 678 pubbliche da System.dll. Si tratta di 89 file DLL di cui 40 non riesce con Assembly.LoadFrom(). Ma non sono sicuro di riuscire a misurare la cosa giusta o nel posto giusto.

chiamata:

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

Funzione:

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

A seconda di come si contano codice privato e interno, nonché enumerazioni, structs e interfacce, il numero può variare molto. – Lucero

+0

C'è anche un blocco iteratore, classi anonime e chiusure che possono causare la creazione di una classe generatrice di compilatori, quindi considerare le classi non pubbliche è probabilmente meno significativo. Quindi ci sono probabilmente varie classi generate dalla macchina usando tecniche come la T4 che spesso incapsulano comportamenti molto simili ma finiscono in classi distinte. Le API che funzionano con metodi factory possono nascondere una serie di classi rilevanti, esponendo per lo più solo interfacce: un'interfaccia potrebbe non avere implementatori pubblici ma essere ancora utilizzabile. Tutto sommato, difficile da misurare ... –

+0

Suggerirei di usare Assembly.ReflectionOnlyLoadFrom anziché Assembly.LoadFrom, solo per il gusto della velocità. –

risposta

16

Quella pagina dà il numero di tipi (40513 in 3.5SP1) - è davvero importante per voi distinguere tra classi e struct/enumerazioni/interfacce?

Mi aspetterei che la stragrande maggioranza di quei 40K + siano classi, quindi la cifra di 6000 è molto conservativa.

dato un elenco di gruppi, è molto facile capire il numero di classi:

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

Questo presuppone che si desidera tutti classi anche se - sono in realtà interessati solo a classi pubbliche?

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

+1 "molto conservativo" in effetti :) –

+0

L'elenco degli assembly proviene dagli 89 file DLL? in C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727? (Per .NET 2.0 sul mio sistema) –

+0

Potrebbe essere - per .NET 2.0. Sembra cambiare per ogni versione. La directory "Reference Assemblies" è promettente, ma per la v3.5 che manca mscorlib.dll e System.dll ... –

Problemi correlati