2009-09-10 17 views
16

Tổng số lớp trong .NET là bao nhiêu? Số điện thoại trong thời gian chạy được tải xuống cho .NET 2.0, .NET 3.0 và .NET 3.5 SP1.Số lớp trong .NET?

Chúng tôi đang viết một bài báo khoa học về một ứng dụng mà dựa trên .NET và hiện đang ghi rằng có nhiều hơn hơn 6000 lớp. Nhưng tôi không chắc liệu đây có phải là số chính xác không.

Ví dụ this page cho biết số lượng hội đồng, không gian tên, phương pháp, v.v., nhưng không phải số lượng lớp học.

Nền tảng thử nghiệm: Windows XP 64 bit SP2, RAM 8 GB.


Cập nhật 4: Bài viết của chúng tôi đã được xuất bản! Tôi đã sử dụng 9911 cho số lớp học (xem cập nhật 3 bên dưới). Nhật ký là Journal of Proteome Research và tiêu đề là: "MSQuant, an Open Source Platform for Mass Spectrometry-Based Quantitative Proteomics". Thật không may, toàn bộ văn bản của bài báo không phải là tự do, chỉ có phần tóm tắt.

Cập nhật 3: Tôi nghĩ rằng tôi đã đến rất gần với một giải pháp hiện tại: 9911 lớp học công cộng dành cho .NET 3.5 SP1. Mở rộng trên bản cập nhật 1, tôi đã thực hiện chức năng đệ quy và mở rộng nó để số lượng các loại, các lớp và các lớp công khai được báo cáo cho bất kỳ thư mục con và thư mục con của nó. Chạy tính năng này trên C: \ WINDOWS \ Microsoft.NET cho các loại 40414, chỉ 0,2% từ số trong referenced article. Full transcript - Nguồn HTML được phân tách bằng tab để mã có thể được nhập vào bảng tính, ví dụ: OpenOffice Calc. Dưới đây là một break-down cho các lớp học công cộng:

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 

Cập nhật 2: Tôi cố gắng sử dụng NDepend và CQL đề xuất bởi lextm và nó đã cho 10% số cao hơn cho .NET 2.0 (89 DLL trong C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727): 5855 lớp học. Đây là một hệ thống khác so với giải pháp lập trình (xem bên dưới).

Thủ tục:

  1. Tải NDepend (NDepend_2_12_1_3122.zip), qua http://www.ndepend.com/NDependDownload.aspx

  2. Giải nén với 7-Zip

  3. Run VisualNDepend.exe

  4. menu File/Chọn Hội đồng .NET để phân tích/ < Chọn 89 tệp DLL trong C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 >/< Chọn tất cả >/OK.

  5. Nhấn "Create Query" (phía dưới bên phải) và gõ/dán:

    CHỌN CÁC LOẠI TỪ Assemblies "tàn tật", "cscompmgd", "CustomMarshalers", "IEExecRemote", "IEHost", "IIEHost" , "ISymWrapper", "Microsoft.Build.Công cụ "," 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 "," Hệ thống "," 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 VÀ IsClass


Cập nhật 1: dựa trên câu trả lời của Jon Skeet tôi đã phát triển một hàm (được liệt kê dưới đây). Kết quả sơ bộ là 5265 lớp học công cộng, tổng số 12626 lớp, 18317 loại cho .NET 2.0. 802 lớp công khai từ mscorlib.dll và 678 public các lớp từ System.dll. Đây là từ 89 tệp DLL trong đó 40 không thành công với Assembly.LoadFrom(). Nhưng tôi không chắc chắn tôi đo lường điều đúng hay đúng nơi.

Gọi:

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

Chức năng:

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

Tùy vào cách bạn đếm đang tin và nội bộ cũng như enums, structs và interfaces, con số có thể thay đổi rất nhiều. – Lucero

+0

Ngoài ra còn có khối lặp, các lớp ẩn danh và các bao đóng có thể gây ra một vài classe do trình biên dịch tạo ra - vì vậy việc xem các lớp không công khai có lẽ ít có ý nghĩa hơn. Sau đó, có thể có nhiều lớp máy được tạo ra bằng cách sử dụng các kỹ thuật như T4 thường đóng gói hành vi rất giống nhau nhưng kết thúc trong các lớp riêng biệt. Api làm việc thông qua các phương thức của nhà máy có thể che giấu một loạt các lớp có liên quan, phơi bày hầu hết chỉ các giao diện - một giao diện có thể không có người triển khai công khai nào vẫn có thể sử dụng được. Tất cả trong tất cả, khó khăn để đo lường ... –

+0

Tôi sẽ đề nghị sử dụng hội.ReflectionOnlyLoadFrom hơn là Assembly.LoadFrom, chỉ vì lợi ích của tốc độ thực sự. –

Trả lời

16

trang đó cho số lượng các loại (40.513 trong 3.5SP1) - là nó thực sự quan trọng với bạn để phân biệt giữa các lớp và cấu trúc/enums/giao diện?

Tôi mong đợi phần lớn 40K + đó là lớp học, vì vậy con số 6000 của bạn rất bảo thủ.

Cho một danh sách các cụm, nó rất dễ dàng để làm việc ra các số lớp:

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

này giả định bạn muốn tất cả lớp mặc dù - là bạn thực sự chỉ quan tâm đến lớp học nào?

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

+1 "rất bảo thủ" thực sự :) –

+0

Danh sách hội đồng có đến từ 89 tệp DLL không trong C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727? (Đối với .NET 2.0 trên hệ thống của tôi) –

+0

Có thể là - đối với .NET 2.0. Nó dường như thay đổi cho mọi phiên bản. Thư mục "Tham chiếu Assemblies" là đầy hứa hẹn, nhưng đối với v3.5 mà bỏ lỡ mscorlib.dll và System.dll ... –

Các vấn đề liên quan