c# - 人们想要使用嵌套类的原因是什么?

标签 c# nested-class

<分区>

this stackoverflow answer一位评论者提到“私有(private)嵌套类”可能非常有用,所以我在 articles such as this one 中阅读了有关它们的内容这往往会解释嵌套类的技术功能,但不会解释您要使用它们的原因

我想我会为属于较大类的小助手类使用私有(private)嵌套类,但通常我需要来自另一个类的助手类,所以我只需要额外的努力(1)使嵌套类成为非嵌套类或(2)将其公开,然后使用其上的外部类前缀访问它,这似乎都是额外的工作,没有任何附加值,因为嵌套类在第一名。因此,总的来说,我真的没有看到嵌套类的用例,除了可能让类更有条理地分组,但我认为这也违背了单类-我喜欢的每个文件清晰度。

您通过哪些方式使用嵌套类来使您的代码更易于管理、更易读、更高效?

最佳答案

您已经回答了自己的问题。当你需要一个在类之外没有意义的辅助类时,使用嵌套类;特别是当嵌套类可以使用外部类的私有(private)实现细节时。

您关于嵌套类无用的论点也是私有(private)方法无用的论点:私有(private)方法可能在类外部有用,因此您必须将其设置为内部方法。内部方法可能在程序集之外有用,因此您可以将其公开。因此,所有方法都应该是公开的。如果您认为这是一个糟糕的论点,那么您对类而不是方法提出相同的论点有什么不同?

我一直在创建嵌套类,因为我经常需要将功能封装在一个在类外部没有意义的帮助器中,并且可以使用外部类的私有(private)实现细节。例如,我编写编译器。我最近写了一个 SemanticAnalyzer 类,它对解析树进行语义分析。它的嵌套类之一是 LocalScopeBuilder。当我分析解析树的语义时,在什么情况下我需要构建本地作用域?绝不。该类完全是语义分析器的一个实现细节。我计划添加更多嵌套类,其名称如 NullableArithmeticAnalyzer 和 OverloadResolutionAnalyzer,它们在类之外也没有用,但我想在这些特定类中封装语言规则。

人们还使用嵌套类来构建诸如迭代器或比较器之类的东西——这些东西在类之外毫无意义,并通过众所周知的接口(interface)公开。

我经常使用的一种模式是拥有扩展其外部类的私有(private)嵌套类:

abstract public class BankAccount
{
    private BankAccount() { }
    // Now no one else can extend BankAccount because a derived class
    // must be able to call a constructor, but all the constructors are
    // private!
    private sealed class ChequingAccount : BankAccount { ... }
    public static BankAccount MakeChequingAccount() { return new ChequingAccount(); }
    private sealed class SavingsAccount : BankAccount { ... }

等等。嵌套类与工厂模式配合得很好。这里的 BankAccount 是各种类型银行账户的工厂,所有这些都可以使用 BankAccount 的私有(private)实现细节。但是没有第三方可以创建自己的扩展 BankAccount 的类型 EvilBankAccount。

关于c# - 人们想要使用嵌套类的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3300051/

相关文章:

c# - LocalReport 方法呈现的线程文化

c# - 在 Visual Studio 中,我可以让一个文件运行另一个文件的自定义工具吗? (在本例中使用 Xsd2Code)

c++ - 公共(public)嵌套类和普通类之间有什么区别吗?

C++ 调用嵌套模板类析构函数

java - 找不到符号 Action 监听器引用变量

c# - MVVM基金会: Why return ICommand when its defined as RelayCommand

c# - FIPS 验证加密算法的问题

c++ - 返回列表索引的更优雅的方式

c# - 在 C# 中获取程序图标?

linqpad 中的根类