你已经回答了你自己的问题。当你需要一个在类外没有意义的辅助类时,使用嵌套类;特别是当嵌套类可以利用外部类的私有实现细节时。
您认为嵌套类无用的论点也是私有方法无用的论点:私有方法可能在类之外有用,因此您必须将其设为内部。内部方法可能在程序集之外很有用,因此您可以将其公开。因此,所有方法都应该是公开的。如果您认为这是一个糟糕的论点,那么您为类而不是方法提出相同的论点有什么不同?
我一直在制作嵌套类,因为我经常需要将功能封装在一个在类之外没有意义的帮助器中,并且可以使用外部类的私有实现细节。例如,我编写编译器。我最近写了一个类 SemanticAnalyzer,它对解析树进行语义分析。它的嵌套类之一是 LocalScopeBuilder。什么情况下我不需要建立本地范围分析解析树的语义?绝不。该类完全是语义分析器的实现细节。我计划添加更多嵌套类,其名称如 NullableArithmeticAnalyzer 和 OverloadResolutionAnalyzer,它们在类之外也无用,但我想将语言规则封装在这些特定类中。
人们还使用嵌套类来构建诸如迭代器或比较器之类的东西——这些东西在类之外没有意义,并且通过众所周知的接口暴露出来。
我经常使用的一种模式是拥有扩展其外部类的私有嵌套类:
abstract public class BankAccount
{
private BankAccount() { }
// Now no one else can extend BankAccount because a derived class
// must be able to call a constructor, but all the constructors are
// private!
private sealed class ChequingAccount : BankAccount { ... }
public static BankAccount MakeChequingAccount() { return new ChequingAccount(); }
private sealed class SavingsAccount : BankAccount { ... }
等等。嵌套类非常适合工厂模式。这里 BankAccount 是各类银行账户的工厂,所有这些都可以使用 BankAccount 的私有实现细节。但是没有第三方可以创建自己的扩展 BankAccount 的类型 EvilBankAccount。