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

时间:2009-01-17 22:41:25

标签: c# scope inner-classes

我对C#相对较新,每次我开始从事C#项目(我只在C#中使用近乎成熟的项目)我想知道为什么没有内部类?

也许我不理解他们的目标。对我来说,内部类 - 至少是私有内部类 - 看起来很像Pascal / Modula-2 / Ada中的“内部程序”:它们允许在较小的部分中分解主类以便于理解。 / p>

示例:以下是大部分时间的内容:

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 个答案:

答案 0 :(得分:76)

嵌套类(可能最好避免单词“inner”作为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
        }
    }
}

我们可以使用一些语言支持来自动完成这些操作 - 这里有很多我没有显示的选项,比如实际上没有为所有值使用嵌套类,或者使用相同的嵌套类多个值,但给它们不同的构造函数参数。但基本上,嵌套类可以调用私有构造函数的事实给了很多权力。

答案 1 :(得分:29)

Framework Design Guidelines具有使用我迄今为止找到的嵌套类的最佳规则。

以下是简要摘要清单:

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

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

  4.   
  5. 避免使用公开暴露的嵌套类型。

  6.   
  7. 如果类型可能在包含类型之外引用,那么 NOT 是否使用嵌套类型。

  8.   
  9. 如果需要通过客户端代码实例化, NOT 使用嵌套类型。

  10.   
  11. NOT 将嵌套类型定义为接口的成员。

  12.   

答案 2 :(得分:12)

您应该限制每个班级的职责,以便每个班级都保持简单,可测试和可重复使用。私人内部阶级反对。它们有助于外部阶级的复杂性,它们是不可测试的,并且它们不可重复使用。

答案 3 :(得分:3)

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

否则,它可能会导致其他从事该项目的开发人员真正发现这些类的混乱,因为他们不清楚它们的位置。