[c#] 为什么我需要使用C#嵌套类



Answers

目的通常只是为了限制嵌套类的范围 。 与普通类相比,嵌套类具有private修饰符的额外可能性(当然也protected )。

基本上,如果你只需要在“父类”中使用这个类(就范围而言),那么通常将其定义为嵌套类。 如果这个类可能需要在没有程序集/库的情况下使用,那么用户将它定义为一个单独的(同级)类通常会更方便,不管这两个类之间是否存在任何概念关系。 尽管创建嵌套在public父类中的public类在技术上是可行的,但在我看来这很少是一个适用的实现。

Question

这个问题在这里已经有了答案:

我试图了解C#中的嵌套类。 我知道嵌套类是在另一个类中定义的类,我不明白为什么我需要这样做。




有时候,实现一个从类内部返回的接口是有用的,但是这个接口的实现应该完全从外部隐藏。

举一个例子 - 在向C#添加yield之前,实现枚举器的一种方法是将枚举器的实现作为私有类实现在集合中。 这样可以方便地访问收藏的成员,但外部世界不需要/看到如何实现的细节。




也许这是什么时候使用嵌套类的好例子?

// ORIGINAL
class ImageCacheSettings { }
class ImageCacheEntry { }
class ImageCache
{
    ImageCacheSettings mSettings;
    List<ImageCacheEntry> mEntries;
}

和:

// REFACTORED
class ImageCache
{
    Settings mSettings;
    List<Entry> mEntries;

    class Settings {}
    class Entry {}
}

PS:我没有考虑应该使用哪些访问修饰符(私有,受保护,公共,内部)




我没有得到的是为什么我会永远需要这样做

我认为你永远不需要这样做。 鉴于这样的嵌套类...

class A
{
  //B is used to help implement A
  class B
  {
    ...etc...
  }
  ...etc...
}

...你总是可以将内部/嵌套类移动到全局范围,像这样...

class A
{
  ...etc...
}

//B is used to help implement A
class B
{
  ...etc...
}

但是,当B仅用于帮助实现A时,则使B成为内部/嵌套类有两个优点:

  • 它不污染全球范围(例如,客户代码可以看到A不知道B类甚至存在)
  • B的方法隐含地访问A的私有成员; 而如果B不是嵌套在A内,B将不能访问A的成员,除非这些成员是内部的或公共的; 但是让这些成员内部或者公开也会让他们接触其他类(不仅仅是B); 相反,保持A私有的方法并让B通过声明B为嵌套类来访问它们。 如果您了解C ++,这就好像在C#中所说的所有嵌套类自动成为它们所包含的类的“ 朋友 ”(并且,声明一个嵌套的类是在C#中声明友谊的唯一方法,因为C#没有friend关键字)。

当我说B可以访问A的私人成员时,假设B有一个对A的引用; 它经常这样做,因为嵌套类通常是这样声明的...

class A
{
  //used to help implement A
  class B
  {
    A m_a;
    internal B(A a) { m_a = a; }
    ...methods of B can access private members of the m_a instance...
  }
  ...etc...
}

...并使用类似这样的代码从A的方法构建...

//create an instance of B, whose implementation can access members of self
B b = new B(this);

你可以在Mehrdad的回复中看到一个例子。




Links