我对C#相对较新,每次我开始从事C#项目(我只在C#中使用近乎成熟的项目)我想知道为什么没有内部类?
也许我不理解他们的目标。对我来说,内部类 - 至少是私有内部类 - 看起来很像Pascal / Modula-2 / Ada中的“内部程序”:它们允许在较小的部分中分解主类以便于理解。 / p>
示例:以下是大部分时间的内容:
public class ClassA
{
public MethodA()
{
<some code>
myObjectClassB.DoSomething(); // ClassB is only used by ClassA
<some code>
}
}
public class ClassB
{
public DoSomething()
{
}
}
由于ClassB只会被ClassA使用(至少有一段时间),我猜这个代码会更好地表达如下:
public class ClassA
{
public MethodA()
{
<some code>
myObjectClassB.DoSomething(); // Class B is only usable by ClassA
<some code>
}
private class ClassB
{
public DoSomething()
{
}
}
}
我很高兴收到你关于这个主题的消息 - 我是对的吗?
答案 0 :(得分:76)
嵌套类(可能最好避免单词“inner”作为C#中的嵌套类与Java中的内部类有些不同)确实非常有用。
一个未提及的模式是“更好的枚举”模式 - 它可以比Java更灵活:
public abstract class MyCleverEnum
{
public static readonly MyCleverEnum First = new FirstCleverEnum();
public static readonly MyCleverEnum Second = new SecondCleverEnum();
// Can only be called by this type *and nested types*
private MyCleverEnum()
{
}
public abstract void SomeMethod();
public abstract void AnotherMethod();
private class FirstCleverEnum : MyCleverEnum
{
public override void SomeMethod()
{
// First-specific behaviour here
}
public override void AnotherMethod()
{
// First-specific behaviour here
}
}
private class SecondCleverEnum : MyCleverEnum
{
public override void SomeMethod()
{
// Second-specific behaviour here
}
public override void AnotherMethod()
{
// Second-specific behaviour here
}
}
}
我们可以使用一些语言支持来自动完成这些操作 - 这里有很多我没有显示的选项,比如实际上没有为所有值使用嵌套类,或者使用相同的嵌套类多个值,但给它们不同的构造函数参数。但基本上,嵌套类可以调用私有构造函数的事实给了很多权力。
答案 1 :(得分:29)
Framework Design Guidelines具有使用我迄今为止找到的嵌套类的最佳规则。
以下是简要摘要清单:
当类型和嵌套类型之间的关系需要成员可访问性语义时,请使用嵌套类型。
NOT 使用公共嵌套类型作为逻辑组构造
避免使用公开暴露的嵌套类型。
如果类型可能在包含类型之外引用,那么 NOT 是否使用嵌套类型。
如果需要通过客户端代码实例化, NOT 使用嵌套类型。
- 醇>
NOT 将嵌套类型定义为接口的成员。
答案 2 :(得分:12)
您应该限制每个班级的职责,以便每个班级都保持简单,可测试和可重复使用。私人内部阶级反对。它们有助于外部阶级的复杂性,它们是不可测试的,并且它们不可重复使用。
答案 3 :(得分:3)
就我个人而言,如果我需要创建一个可能需要方法的对象的进程内集合,我只创建私有内部类。
否则,它可能会导致其他从事该项目的开发人员真正发现这些类的混乱,因为他们不清楚它们的位置。