你想什么时候在C#中嵌套类?

时间:2009-09-15 15:42:11

标签: c# class class-design nested-class nested

具体来说,任何人都可以给我一个何时或何时不使用嵌套类的具体例子?

我永远都知道这个功能,但从来没有理由使用它。

感谢。

9 个答案:

答案 0 :(得分:16)

当嵌套类仅由外部类使用时,不再需要的一个很好的例子是集合的枚举器类。

另一个例子可能是枚举替换类中方法使用的真假参数,以澄清调用签名......

而不是

public class Product
{
    public void AmountInInventory(int warehouseId, bool includeReturns)
    {
        int totalCount = CountOfNewItems();
        if (includeReturns)
            totalCount+= CountOfReturnedItems();
        return totalCount;
    }
}

  product P = new Product();
  int TotalInventory = P.AmountInInventory(123, true);  

让人们不清楚“真实”意味着什么,你可以写:

public class Product
{
    [Flags]public enum Include{None=0, New=1, Returns=2, All=3 }
    public void AmountInInventory(int warehouseId, Include include)
    {
        int totalCount = 0;
        if ((include & Include.New) == Include.New)
            totalCount += CountOfNewItems();
        if ((include & Include.Returns) == Include.Returns)
            totalCount += CountOfReturns();
        return totalCount;
    }
}


  product P = new Product();
  int TotalInventory = P.AmountInInventory(123, Product.Include.All);  

这使得客户端代码中的参数值清晰。

答案 1 :(得分:11)

我使用嵌套类的两个地方:

  • 嵌套类专门由外部类使用,我想要完全私有范围。

  • 嵌套类专门用于实现其他地方定义的接口。例如,实现枚举器属于此类别。

答案 2 :(得分:4)

当你确定嵌套类没有意义在任何其他地方使用它时,你真的只想使用嵌套类。

例如,如果您需要创建几个类型的对象的列表,这些对象与函数和关于该对象的成员信息短时间关联(如方法或属性),您可以使用嵌套类来执行此操作。也许您需要创建某种类型对象的所有组合的列表,然后标记具有特定属性的所有组合。这对于嵌套类来说是个好例子。

如果你不需要嵌套类的方法,你可以只使用 struct ,但我不知道IL是否以不同的方式处理它们。

答案 3 :(得分:3)

我有时将它用于简单的辅助类,我需要一个函数或父类内部的函数。

答案 4 :(得分:3)

一个实际的例子,请看今天早上提出的这个问题:
Make an object accessible to only one other object in the same assembly?

总结:您可以在其业务对象中嵌套关联的数据类。

答案 5 :(得分:2)

当一个特殊目的数据结构仅在一个类中使用,或者抛出某个异常并且仅在一个类中捕获时,我已经看到了嵌套类的情况。

答案 6 :(得分:1)

当我有一个辅助类时,我会嵌套类,而这个辅助类不需要对系统中的任何其他对象可见。这使可见性尽可能受到限制,这有助于防止无意中使用类

答案 7 :(得分:1)

遵循Bob叔叔关于凝聚力的“规则”应该发现你实际上创建了许多嵌套(和嵌套,嵌套!)类。如果您有其他客户端现在引用它们,则可以非嵌套但

答案 8 :(得分:1)

我想改进我以前的答案!

我定期使用嵌套类的特定区域是启用接口注入和控制反转。实施例...

public class Worker
{
  private IHelper _helper;

  public Worker()
    : this (new DefaultHelper())
  {
  }
  public Worker(IHelper helper)
  {
    this._helper = helper;
  }

  private class DefaultHelper : IHelper
  {
  }
}