3

静态内部类是否有性能成本?还是我应该只编写与非内部类相同的静态类?

4

4 回答 4

5

如果您的业务/数据逻辑确定一个类应该是内部类,则将其设为内部类。

如果您遇到性能问题,请进行测量以确定问题所在,然后确定要进行哪些优化。

于 2010-07-19T22:25:27.807 回答
2

根据我刚刚跑过的这个测试*,没有区别。

public static class OuterClass
{
    public static int GetNumber()
    {
        return 1;
    }

    public static string GetString()
    {
        return "Hello, World!";
    }
}

public class Program
{
    private static class InnerClass
    {
        public static int GetNumber()
        {
            return 1;
        }

        public static string GetString()
        {
            return "Hello, World!";
        }
    }

    const int N = 1000000;

    public static void Main()
    {
        var sw = Stopwatch.StartNew();
        for (int i = 0; i < N; ++i)
        {
            int x = OuterClass.GetNumber();
            string s = OuterClass.GetString();
        }
        sw.Stop();

        TimeSpan outerTime = sw.Elapsed;

        sw.Reset();
        sw.Start();
        for (int i = 0; i < N; ++i)
        {
            int x = InnerClass.GetNumber();
            string s = InnerClass.GetString();
        }
        sw.Stop();

        TimeSpan innerTime = sw.Elapsed;

        Console.WriteLine("Outer took {0:0.00} ms.", outerTime.TotalMilliseconds);
        Console.WriteLine("Inner took {0:0.00} ms.", innerTime.TotalMilliseconds);
    }
}

输出:

外部耗时 0.28 毫秒。
内部耗时 0.27 毫秒。

我运行了几次,数字始终相同。

*我假设您询问的是访问外部静态类与内部静态类的成员(例如,调用方法调用)的成本。如果我误解了,这个测试是无关紧要的。

于 2010-07-19T22:35:40.653 回答
1

嵌套类是关于语义和可见性的,这些几乎总是比性能重要得多。

我们应该忘记小的效率,比如大约 97% 的时间:过早优化是万恶之源。(唐纳德·克努斯)

除此之外,我非常有信心没有(重要的)性能差异 - 它只是一个具有不同可见性的普通类。也许在类初始化或使用反射时会有一些细微的差别,但这并不重要。

于 2010-07-19T22:32:07.823 回答
0

不,但是如果您使用带有泛型的嵌套类,则会出现一些严重的语义问题。(尽管其中一些问题是非常积极的,例如内部类如何继承父类的类型参数。)

于 2010-07-19T22:39:37.073 回答