静态内部类是否有性能成本?

时间:2010-07-19 22:23:20

标签: c# performance inner-classes static-class

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

4 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

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

  

我们应该忘记小的效率,大约97%的时间说:过早的优化是所有邪恶的根源。 (唐纳德克努特)

除此之外,我非常确信没有(重要的)性能差异 - 它只是一个具有不同可见性的普通类。也许在课堂初学阶段或使用反思时会有一些微妙的差异,但这几乎不重要。

答案 2 :(得分:1)

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

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);
    }
}

输出:

Outer took 0.28 ms.
Inner took 0.27 ms.

我跑了几次,数字一直都是一样的。

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

答案 3 :(得分:0)

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