人们想要使用嵌套类的原因是什么?在这个stackoverflow的回答中,一位评论者提到“私有嵌套类”非常有用,所以我在这篇文章中阅读了它们,它倾向于解释嵌套类在技术上是如何工作的,而不是为什么要使用它们。我想我会为属于较大类的小辅助类使用私有嵌套类,但我经常需要另一个类的辅助类,所以我只需要额外努力(1)使嵌套类成为非嵌套类或(2)将其公开,然后使用外部类前缀访问它,这两者看起来都是额外的工作,没有附加值,因为首先使用了嵌套类。所以总的来说,除了可能将类更多地组织成组之外,我并没有真正看到嵌套类的用例,但我也违反了我已经喜欢的每个文件的第一级清晰度。您以何种方式使用嵌套类来使您的代码更易于管理、可读和高效?你已经回答了你自己的问题。当你需要一个在类之外没有意义的辅助类时,使用嵌套类;特别是当嵌套类可以使用外部类的私有实现细节时。你认为嵌套类无用的论点也是私有方法无用的参数:私有方法在类外部可能有用,所以你必须将它们设为内部。内部方法在程序集之外很有用,因此您可以将它们公开。因此,所有方法都应该是公开的。如果您认为这是一个错误的论点,那么为类而不是方法创建相同的参数有什么区别?我一直在创建嵌套类,因为我经常需要将一个函数包装在一个在类外部没有意义的帮助器中,并且可以使用外部类的私有实现细节。例如,我编写编译器。我最近写了一个SemanticAnalyzer类,它对解析树进行语义分析。它的嵌套类之一是LocalScopeBuilder。当我不分析解析树的语义时,什么时候需要构建本地作用域?绝不。这个类完全是语义分析器的一个实现细节。我计划添加更多嵌套类,其名称如NullableArithmeticAnalyzer和OverloadResolutionAnalyzer在类外无用,但我想将语言规则封装在这些特定类中。人们还使用嵌套类来构建诸如迭代器或比较器之类的东西——在类之外没有任何意义并通过众所周知的接口公开的东西。我经常使用的一种模式是拥有一个扩展其外部类的私有嵌套类:abstractpublicclassBankAccount{privateBankAccount(){}//现在没有其他人可以扩展BankAccount因为派生类//必须能够调用一个构造函数,但是所有的构造函数都是//私有的!私有密封类ChequingAccount:BankAccount{...}publicstaticBankAccountMakeChequingAccount(){returnnewChequingAccount();}privatesealedclassSavingsAccount:BankAccount{...}等等。嵌套类非常适合工厂模式。BankAccount是各种类型银行账户的工厂,所有这些都可以使用BankAccount的私有实现细节。但是任何第三方都不能创建自己扩展BankAccount类型的EvilBankAccount。将接口返回给要隐藏其实现的调用方。publicclassOuter{privateclassInner:IEnumerable{/*大概这个类包含一些Outer需要*访问的功能,但调用者不应该看到这些功能*/}publicIEnumerableGetFoos(){returnnewInner();私有助手类就是一个很好的例子。例如,后台线程的状态对象。没有令人信服的理由公开这些类型。将它们定义为私有嵌套类型似乎是一种非常简洁的处理方式。当两个绑定值(比如在哈希表中)在内部不够用,但在外部足够用时,我会使用它们。然后我创建了一个嵌套类,其中包含我需要存储的属性,并通过方法仅公开其中的一些属性。我认为这是有道理的,因为如果没有其他人要使用它,为什么要为它创建一个外部类呢?它只是没有意义。对于每个文件一个类,您可以使用partial关键字创建部分类,这是我通常做的。我最近遇到的一个引人注目的例子是许多数据结构的Node类。例如,四叉树需要知道它如何在其节点中存储数据,但代码的其他部分不应该关心。“私有嵌套类”很有用注意那句话中的私有。公共嵌套类型已弃用。就像大多数已经提到的答案一样:每个类本身就是一个小软件项目。有时需要招募帮手。但这不是值得努力的东西,你仍然不希望班级太大或太复杂。我发现它们在某些情况下非常方便:管理复杂的私有状态,例如Interpolator类使用的InterpolationTriangle。Interpolator的使用者不需要知道它是使用Delauney三角剖分实现的,当然也不需要知道三角形,所以数据结构是一个私有嵌套类。正如其他人所提到的,您可以使用接口来公开类使用的数据,而无需透露该类的完整实现。嵌套类还可以访问外部类的私有状态,这使您可以编写紧密耦合的代码,而无需与公共(甚至在内部与程序集的其余部分)紧密耦合。我遇到过框架要求类派生自某些基类(如WPF中的DependencyObject)的情况,但您希望您的类继承自不同的基类。通过使用从框架基类继承的私有嵌套类,可以与框架进行互操作。因为嵌套类可以访问私有状态(创建它时只需将父级的'this'传递给它),你基本上可以使用this通过组合实现穷人的多重继承。使用此技术的一种非常常见的模式是,当类从其属性或方法之一返回接口或基类类型时,但具体类型是私有嵌套类。考虑以下示例。公共类MyCollection:IEnumerable{publicIEnumeratorGetEnumerator(){returnnewMyEnumerator();}privateclassMyEnumerator{}}我通常在某些情况下需要SRP(SingleResponsibilityPrincipal)组合时这样做。“好吧,如果SRP是你的目标,为什么不把它们分成不同的类别呢?”您将在80%的时间内这样做,但是如果您创建的类对外界无用怎么办?您不希望您的程序集的API与您刚使用的类混在一起。“所以,这不就是内部的意思吗?”当然。这些案例中大约有80%。但是那些必须访问或修改公共类状态的内部类呢?例如,将类分解为一个或多个内部类以满足您的SRP条带?您必须将这些内部类使用的所有方法和属性标记为内部类。“这有什么问题吗?”没有。这些案例中大约有80%。当然,现在您正在使用仅适用于您之前创建的类的方法/属性来扰乱类的内部接口。现在您不得不担心团队中编写内部代码的其他人不会以您不希望破坏您的状态的方式使用这些方法。内部类可以修改定义它们的任何类型实例的状态。因此,如果您不向类型定义添加成员,您的内部类可以根据需要处理它们。其中,在100例中大约有14例,最好的做法是保持类型清洁、代码可靠/可维护以及责任单一。我认为其他人已经很好地涵盖了公共和私有嵌套类的用例。我没有看到的一件事是对每个文件一个类的关注。您可以通过将外部类设为本地来解决此问题,并将内部类定义移动到单独的文件中。OuterClass.cs:namespaceMyNameSpace{publicpartialclassOuterClass{//这里是主类成员//可以使用内部类}}OuterClass.Inner.cs:namespaceMyNameSpace{publicpartialclassOuterClass{privateclassInner{//这里是内部类成员您甚至可以使用VisualStudio的项嵌套使OuterClass.Inner.cs成为OuterClass.cs的“子级”,以避免使您的解决方案资源管理器混乱。例如,它们非常适合单例模式的实现。我有几个地方可以用来“增加”价值。我有一个多选组合框,我的内部类存储复选框的状态和数据项。世界上没有必要知道/使用这个内部类。私有匿名嵌套类对于GUI中的事件处理程序是必不可少的。如果一个类不是另一个类导出的API的一部分,则必须将其设为私有。否则你暴露的比你想要的多。“TheMillionDollarBug”就是一个例子。大多数程序员对此太懒了。如果对象需要返回一些关于其状态的抽象信息,PeterPrivate嵌套类可能是合适的。例如,如果Fnord支持“SaveContext”和“RestoreContext”方法,则使用“SaveContext”函数返回Fnord.SavedContext类型的对象可能很有用。类型访问规则并不总是最有用的;例如,似乎很难允许Fnord访问Fnord.SavedContext的属性和方法而不让它们对外部人员可见。另一方面,您可以让Fnord.CreateSaveContext创建一个新的Fnord.SaveContext,将Fnord作为参数(因为Fnord.SaveContext可以访问Fnord的内部),并且Fnord.LoadContextFrom()可以调用Fnord.SaveContext.RestoreContextTo().这个问题被标记为C#所以我不确定这是否有意义,但是在COM中,当C++类实现多个COM接口时,您可以使用内部类来实现接口......实际上您将它用于组合而不是多重继承。此外,在MFC和其他技术中,您可能需要您的控件/对话框有一个放置目标类,这除了作为一个嵌套类之外没有什么意义。以上就是C#学习教程:人们为什么要使用嵌套类的原因是什么?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
