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:
Pobierz NDepend (NDepend_2_12_1_3122.zip) poprzez http://www.ndepend.com/NDependDownload.aspx
Rozpakuj z 7-Zip
Run VisualNDepend.exe
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.
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()
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
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 ... –
Proponuję użyć zestawu.ReflectionOnlyLoadFrom zamiast Assembly.LoadFrom, tylko ze względu na szybkość naprawdę. –