在C#中的另一个类内声明的类

Jer*_*ron 47 c# oop class

我正在研究一些遗留代码,并且遇到了一些我不确定的问题.我们有一个class y在另一个内部声明class x.Class y只是在里面使用class x但我的问题是为什么你不创建一个单独的类文件并放在class y那里而不是在其中声明它class x?这不是违反OOP的,或者只是风格问题,因为它只在本课程中使用过.我正在重构一些代码,我的第一反应是分离class y出它自己的文件.

namespace Library
{
   public class x
   {
      // methods, properties, local members of class x

      class y
      {
         // methods, properties, local members of class y
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

pli*_*nth 60

您创建了一个内部类,因为它只在类x的范围内使用,并且它在逻辑上适合于类x的因子/体系结构.

类y也可能知道x类的实现细节,这些细节并不是公众所知的.

  • 没关系,刚刚找到http://blogs.msdn.com/b/oldnewthing/archive/2006/08/01/685248.aspx (2认同)

Mar*_*ell 20

这具有权限含义.顶级"类y"将是"内部" - 但是,这里"y"对"x"是私有的.此方法有助于实现细节(例如缓存行等).同样,y可以访问所有私有状态x.

仿制药也有其含义; x<T>.y是通用的"T",继承自外部类.你可以在这里看到这里,Bar充分利用T- 并注意任何静态字段的Bar范围T.

class Foo<T> {
    void Test(T value) {
        Bar bar = new Bar();
        bar.Value = value;
    }
    class Bar {
        public T Value { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

通常人们错误地认为他们需要定义BarBar<T>- 这现在(有效地)是双重通用的 - 即Foo<TOld, T>- TOld现在(现在不可用)T来自哪里Foo<T>.所以不要这样做!或者,如果您希望它是双重通用的,请选择不同的名称.幸运的是,编译器警告你这个......

  • +1解释外部类中的"T"如何成为内部类的闭合构造类型的一部分可能是个好主意.许多人都不知道这一点很重要. (3认同)

Paw*_*iak 7

这个代码很好,因为你给出的确切原因 - "类y只在类x中使用过".这些是嵌套类型,使用它们的一个原则是嵌套类型应该与它们的声明类型紧密耦合,并且不能用作通用类型.这样,嵌套类对其他类来说是不可能的,但仍然允许您遵循面向对象的原则.