C # 中的私有内部类——为什么不经常使用它们?

我对 C # 相对比较陌生,每次我开始处理一个 C # 项目(我只处理 C # 中几乎成熟的项目) ,我都想知道为什么没有内部类?

也许我不明白他们的目的。对我来说,内部类——至少是私有内部类——看起来很像 Pascal/Modula-2/Ada 中的“内部过程”: 它们允许将主类分解成更小的部分,以便于理解。

下面是我们经常看到的:

public class ClassA
{
public MethodA()
{
<some code>
myObjectClassB.DoSomething(); // ClassB is only used by ClassA
<some code>
}
}


public class ClassB
{
public DoSomething()
{
}
}

由于 ClassB 只能由 ClassA 使用(至少在一段时间内) ,我猜测这段代码最好表示如下:

   public class ClassA
{
public MethodA()
{
<some code>
myObjectClassB.DoSomething(); // Class B is only usable by ClassA
<some code>
}


private class ClassB
{
public DoSomething()
{
}
}
}

我很高兴听到你对这个问题的看法,我说的对吗?

74060 次浏览

就我个人而言,我只有在需要创建进程内对象集合时才创建私有内部类,这些对象可能需要对它们使用方法。

否则,它可能会使从事该项目的其他开发人员在实际查找这些类时感到困惑,因为他们并不十分清楚这些类的位置。

嵌套类(可能最好避免使用“ inner”这个词,因为 C # 中的嵌套类与 Java 中的内部类有些不同)确实非常有用。

还有一种模式没有被提及,那就是“ better enum”模式——它甚至比 Java 中的模式更加灵活:

public abstract class MyCleverEnum
{
public static readonly MyCleverEnum First = new FirstCleverEnum();
public static readonly MyCleverEnum Second = new SecondCleverEnum();


// Can only be called by this type *and nested types*
private MyCleverEnum()
{
}


public abstract void SomeMethod();
public abstract void AnotherMethod();


private class FirstCleverEnum : MyCleverEnum
{
public override void SomeMethod()
{
// First-specific behaviour here
}


public override void AnotherMethod()
{
// First-specific behaviour here
}
}


private class SecondCleverEnum : MyCleverEnum
{
public override void SomeMethod()
{
// Second-specific behaviour here
}


public override void AnotherMethod()
{
// Second-specific behaviour here
}
}
}

我们可以使用一些语言支持来自动完成其中的一些工作——这里还有很多选项我没有展示,比如不对所有的值使用嵌套类,或者对多个值使用相同的嵌套类,而是给它们不同的构造函数参数。但基本上,嵌套类可以调用私有构造函数这一事实赋予了它很大的权力。

你应该限制每个类的责任,以便每个保持 简单、可测试和可重复使用。私人内部阶级与此背道而驰。它们导致了外部类的复杂性,它们不可测试,也不可重用。

框架设计指引拥有迄今为止我所发现的使用嵌套类的最佳规则。

下面是一个简短的摘要列表:

  1. 当类型和嵌套类型之间的关系是所需的成员可访问性语义时,请使用嵌套类型。

  2. 没有是否使用公共嵌套类型作为逻辑组构造

  3. 避免使用公开公开的嵌套类型。

  4. 如果类型可能在包含类型之外引用,则 没有使用嵌套类型。

  5. 如果需要通过客户端代码实例化嵌套类型,则 没有使用嵌套类型。

  6. 没有是否将嵌套类型定义为接口的成员。