为什么/何时应在.net中使用嵌套类?难道不是吗?

时间:2020-03-05 18:49:05  来源:igfitidea点击:

在Kathleen Dollard最近的博客文章中,她提出了一个有趣的理由,要求在.net中使用嵌套类。但是,她还提到FxCop不喜欢嵌套类。我假设编写FxCop规则的人并不愚蠢,因此在该职位后面必须有推理,但我找不到它。

解决方案

回答

当我们要嵌套的类仅对封闭类有用时,请使用嵌套类。例如,嵌套类使我们可以编写类似(简化)的内容:

public class SortedMap {
    private class TreeNode {
        TreeNode left;
        TreeNode right;
    }
}

我们可以在一个地方对类进行完整定义,而不必跳过任何PIMPL箍来定义类的工作方式,并且外界无需查看任何实现。

如果TreeNode类是外部类,则或者必须使所有字段都成为public,或者要使一堆get / set方法来使用它。外部世界将有另一类污染他们的智力。

回答

如果我理解Katheleen的文章正确,她建议使用嵌套类来编写SomeEntity.Collection而不是EntityCollection <SomeEntity>。我认为这是为我们节省输入时间的有争议的方式。我非常确定,在现实世界中,应用程序集合在实现上会有所不同,因此无论如何我们都需要创建单独的类。我认为使用类名来限制其他类的范围不是一个好主意。它会污染智能感知并增强类之间的依赖关系。使用名称空间是控制类范围的标准方法。但是我发现使用@hazzen注释中的嵌套类是可以接受的,除非我们有大量的嵌套类,这表明设计不好。

回答

这取决于用法。我很少使用公共嵌套类,而一直使用私有嵌套类。私有嵌套类可用于仅在父级内部使用的子对象。例如,如果HashTable类包含私有Entry对象以仅在内部存储数据,则为该示例。

如果该类是供调用者(外部)使用的,则我通常喜欢将其设为独立的独立类。

回答

从Sun的Java教程中:

为什么要使用嵌套类?
使用嵌套类有许多令人信服的原因,其中包括:

  • 这是一种对仅在一个地方使用的类进行逻辑分组的方法。
  • 它增加了封装。
  • 嵌套类可以导致更具可读性和可维护性的代码。

类的逻辑分组如果一个类仅对另一个类有用,那么将其嵌入该类并将两者保持在一起是合乎逻辑的。嵌套此类"帮助程序类"可使它们的程序包更加简化。

增加封装考虑两个顶级类A和B,其中B需要访问A的成员,否则将其声明为私有。通过将类B隐藏在类A中,可以将A的成员声明为私有,而B可以访问它们。另外,B本身可以对外界隐藏。 <这不适用于C#的嵌套类实现,这仅适用于Java。

更具可读性和可维护性的代码在顶级类中嵌套小类可将代码放置在离使用位置更近的地方。

回答

完全惰性和线程安全的单例模式

public sealed class Singleton
{
    Singleton()
    {
    }

    public static Singleton Instance
    {
        get
        {
            return Nested.instance;
        }
    }

    class Nested
    {
        // Explicit static constructor to tell C# compiler
        // not to mark type as beforefieldinit
        static Nested()
        {
        }

        internal static readonly Singleton instance = new Singleton();
    }
}

来源:http://www.yoda.arachsys.com/csharp/singleton.html