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:
Scarica NDepend (NDepend_2_12_1_3122.zip), via http://www.ndepend.com/NDependDownload.aspx
Unzip con 7-Zip
Run VisualNDepend.exe
menu File/Seleziona .NET Assemblies to Analyze/ < Selezionati i 89 file DLL in C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 >/< Selezionati tutti >/OK.
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()
A seconda di come si contano codice privato e interno, nonché enumerazioni, structs e interfacce, il numero può variare molto. – Lucero
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 ... –
Suggerirei di usare Assembly.ReflectionOnlyLoadFrom anziché Assembly.LoadFrom, solo per il gusto della velocità. –