78

我对 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()
         {
         }
      }
   }

我很高兴收到你关于这个问题的消息——我说得对吗?

4

4 回答 4

82

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

一种没有被提及的模式是“更好的枚举”模式——它甚至比 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
        }
    }
}

我们可以通过一些语言支持来自动执行其中的一些操作——还有很多我没有在这里展示的选项,比如实际上不对所有值使用嵌套类,或者对多个值使用同一个嵌套类,但给他们不同的构造函数参数。但基本上,嵌套类可以调用私有构造函数这一事实提供了很大的力量。

于 2009-01-17T23:29:26.397 回答
31

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

这是一个简短的摘要列表:

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

  2. 不要使用公共嵌套类型作为逻辑组构造

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

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

  5. 如果需要由客户端代码实例化,请勿使用嵌套类型。

  6. 不要将嵌套类型定义为接口的成员。

于 2009-11-12T20:10:04.890 回答
12

您应该限制每个类的职责,以使每个类都保持简单、可测试和可重用。私有内部类与此相反。它们增加了外部类的复杂性,它们不可测试且不可重用。

于 2009-01-17T23:47:35.360 回答
3

就我个人而言,如果我需要创建可能需要方法的对象的进程内集合,我只会创建私有内部类。

否则,可能会导致从事该项目的其他开发人员在实际找到这些类时感到困惑,因为他们不太清楚它们在哪里。

于 2009-01-17T22:48:05.637 回答