C# - 定义公共嵌套类:我们应该这样做吗?

时间:2011-08-22 04:41:27

标签: c# coding-style subclass

过去我避免定义嵌套类。但是如果一个类只能在初级类中使用,那么将该类嵌套为理想的位置吗?关于这个问题是否有任何公认的惯例?

public class PrimaryClass
{
    public class SubClass
    {
        // ...
    }

    public SubClass MySubClass { get; set; }
    // ...
}

或者它应该始终是

public class SubClass
{
    // ...
}

public class PrimaryClass
{
    public SubClass MySubClass { get; set; }
    // ...
}

5 个答案:

答案 0 :(得分:2)

如果内部类仅在外部类中使用,则可以定义嵌套类(该类在另一个类中定义)。

请参阅这篇文章 Why Would I Ever Need to Use C# Nested Classes

答案 1 :(得分:1)

您完全正确 - 如果子类仅在主类中使用过,则最好将关注点分开。在Java中,这是一个称为匿名内部类的语言级构造。如果需要,您可以随后稍后重构子类。

比较C#和Java的wiki文章有一个非常好的分析,涵盖了一般指南和语言特定问题。 http://en.wikipedia.org/wiki/Comparison_of_C_Sharp_and_Java#Inner_and_local_classes

答案 2 :(得分:0)

如果内部类是其父外部类的固有部分,那么这样做完全没问题。我看到一个内部类就像外部类的任何其他成员一样,除了它带有自己的一组方法和属性。

例如,发动机是机动车辆的固有部件。它不能在一个外面起作用(因此没有意义),换句话说,它的存在的意义仅取决于机动车辆。我当然在这里假设发动机除了机动车之外别无其他任何东西(想不出更好的例子,对不起)。

在C#中,您当然也可以将发动机作为一个单独的类来实现,并从机动车类中引用它。这真的是你的选择。

答案 3 :(得分:0)

除了仅在外部类中使用嵌套类之外,还有一些情况需要将它的实例交给外部世界。通常你使用inerface来做到这一点。以下是如何使用嵌套类和接口的示例:

   public interface IDoSomething {...}

   public class Outer
   {

        public static IDoSomething GetSomethingToDo( ... parameters ...)
        { 
            if (...) return new SomethingA();
            else return new SomethingB();
        }

        private class SomethingA : IDoSomething { ...}
        private class SomethingB : IDoSomething { ...}

    }

DoSomething的实施完全隐藏在外部世界之外。

答案 4 :(得分:0)

我倾向于将嵌套类定义为私有,从不公开。以这种方式,嵌套类将仅由封闭类使用。只有当嵌套类被多个顶级类使用时,才将类移到顶层。然后我通常将其内部化。

应为枚举保留使用公共嵌套类。