10

我经常读到这个框架太大了,以至于一个开发人员无法体验它的每一部分。拥有一些实际数字肯定有助于正确看待事情。

MSDN 似乎将它们全部列出,但没有实际数字(据我所见),花费数小时计算它们并不是我对生产时间的看法。

  • 命名空间的数量
  • 班级数
  • 结构数
  • 接口数量

我意识到还有委托、枚举、事件等,但上述类型是最有趣的。

此外,基类库 (BCL) 中的类型数量以及整个框架类库 (FCL) 的大小也会很有趣。

此信息将在 2 个方面有用:

首先,要了解您实际使用了多少整体框架以及您还需要学习多少。

其次,来自其他平台的许多程序员(和非技术人员)常常对程序员可以将大部分时间花在“.NET Framework”中而感到惊讶。有一些数字肯定会帮助解释为什么这不是狭隘的技能/经验的迹象。

[更新]

使用 Andrew 的代码(在我的 .NET 3.5 SP1 系统上)我得到:

班级:12688
值类型:4438
接口:1296
4

5 回答 5

6

这 2 篇博客文章讨论了这个主题:

结果按程序集、命名空间、类型、成员和其他项的数量进行细分。

于 2010-01-26T04:51:24.437 回答
5

您可以使用反射来查找 BCL 中不同类型的数量,但是您希望通过这些信息完成什么?

以下是如何获取该信息的示例:

using System;
using System.Linq;
using System.Reflection;

class Example
{
    static void Main()
    {
        Assembly mscorlib = typeof(String).Assembly;

        // Number of classes
        Console.WriteLine(mscorlib.GetTypes().Where(t => t.IsClass).Count());
        // Number of value types (structs and enums)
        Console.WriteLine(mscorlib.GetTypes().Where(t => t.IsValueType).Count());
        // Number of interfaces
        Console.WriteLine(mscorlib.GetTypes().Where(t => t.IsInterface).Count());
    }
}

请注意,您需要为框架中的每个程序集执行此操作以获取总数。

编辑:这是一个快速而肮脏的解决方案,可以让您大致了解 BCL 中的类型数量:

using System;
using System.Linq;
using System.Reflection;
using System.IO;
using System.Runtime.InteropServices;

class Example
{
    static void Main()
    {
        // Get all DLLs in the current runtime directory
        var assemblies = Directory.GetFiles(
            RuntimeEnvironment.GetRuntimeDirectory())
            .Where(f => f.EndsWith(".dll"));

        Int32 classes = 0;
        Int32 valueTypes = 0;
        Int32 interfaces = 0;

        foreach (String name in assemblies)
        {
            // We need to catch BadImageFormatException
            // because not all DLLs in the runtime directory
            // are CLR assemblies.
            try
            {
                var types = Assembly.LoadFile(name).GetTypes();

                classes += types.Where(t => t.IsClass).Count();
                valueTypes += types.Where(t => t.IsValueType).Count();
                interfaces += types.Where(t => t.IsInterface).Count();
            }
            catch (BadImageFormatException) { }
        }

        Console.WriteLine("Classes: {0}", classes);
        Console.WriteLine("Value types: {0}", valueTypes);
        Console.WriteLine("Interfaces: {0}", interfaces);
    }
}
于 2010-01-26T04:04:22.157 回答
2

我自己没有使用过,但我认为这是NDepend可以提供给您的那种信息。

于 2010-01-26T04:15:17.663 回答
0

它这么大,没有人真正知道它的大小?

就文件大小而言,在我的系统上,2.0、3.0 和 3.5 框架占用大约 130MB 磁盘空间,而 64 位版本大约占用 93MB。但这还不包括 Win7 本身的核心内容。

于 2010-01-26T04:07:27.657 回答
0

如果没有定义“大”的含义——IL (.dll) 大小,这有点难以回答?源代码大小?功能范围?此外,您是否在谈论最新的 3.5 SP1 可再发行组件,没有任何官方附加组件(即 F# 的东西、MVC 等),这些附加组件是“框架”的完全支持部分,但不随3.5 可再发行?

我不是想变得困难......我只是说有一些变量会影响人们如何确定要测量的内容,然后是一些关于使用哪种棒来测量它的问题。

于 2010-01-26T05:43:38.490 回答