静态内部类是否有性能成本?或者我应该只编写与非内部类相同的静态类?
答案 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)
不,但如果您使用带有泛型的嵌套类,则会出现一些严重的语义问题。 (虽然其中一些问题非常积极,就像内部类如何继承父类的类型参数一样。)