c#公共嵌套类还是更好的选择?

c#公共嵌套类还是更好的选择?,c#,nested-class,C#,Nested Class,我有一个控制电路,它有多个设置,可以连接任意数量的传感器(每个传感器都有自己的设置)。这些传感器只能与控制电路一起使用。我考虑过使用嵌套类,如下所示: public class ControlCircuitLib { // Fields. private Settings controllerSettings; private List<Sensor> attachedSensors; // Properties. public Settin

我有一个控制电路,它有多个设置,可以连接任意数量的传感器(每个传感器都有自己的设置)。这些传感器只能与控制电路一起使用。我考虑过使用嵌套类,如下所示:

public class ControlCircuitLib
{
    // Fields.
    private Settings controllerSettings;
    private List<Sensor> attachedSensors;

    // Properties.
    public Settings ControllerSettings
    { get { return this.controllerSettings; } }

    public List<Sensor> AttachedSensors
    { get { return this.attachedSensors; } }

    // Constructors, methods, etc.
    ...

    // Nested classes.
    public class Settings
    {
       // Fields.
       private ControlCircuitLib controllerCircuit;
       private SerialPort controllerSerialPort;
       private int activeOutputs;
       ... (many, many more settings)

       // Properties.
       public int ActiveOutputs
       { get { return this.activeOutputs; } }
       ... (the other Get properties for the settings)

       // Methods.
       ... (method to set the circuit properties though serial port)        
    }

    public class Sensor
    {
       // Enumerations.
       public enum MeasurementTypes { Displacement, Velocity, Acceleration };

       // Fields.
       private ControlCircuitLib controllerCircuit;
       private string sensorName;
       private MeasurementTypes measurementType;
       private double requiredInputVoltage;
       ... (many, many more settings)

       // Properties.
       public string SensorName {...}
       ... (Get properties)

       // Methods.
       ... (methods to set the sensor settings while attached to the control circuit)
    }
}
所有设置都是通过控制器设置的,但我希望有一个有组织的库,而不是将所有~100个方法、属性和设置塞进一个
controller
类中。如果有人能提供一个简短的例子,概述他们将使用的结构,我们将不胜感激。谢谢

我对公共嵌套类没有太多问题(一般来说,我不喜欢教条式的规则),但是您是否考虑过将所有这些类型放在它们自己的名称空间中?这是将类分组在一起的更常见的方法


编辑:只是澄清一下,我很少使用公共嵌套类,在这里我可能不会使用它们,但我也不会完全回避它们。框架中有很多公共嵌套类型的示例(例如,
List.Enumerator
)-毫无疑问,在每种情况下,设计者都会考虑使用嵌套类的“味道”,并认为它比将类型提升为顶级类型更具味道,或者为所涉及的类型创建一个新的名称空间。

我认为更好的选择是将这些嵌套类移出它们所在的类,并让它们独立存在。除非我遗漏了一些东西,否则您似乎只是为了某种范围概念而将它们放在主类中,但实际上,名称空间就是为了这个

我喜欢这种情况下的嵌套类,因为它显示了这种关系。如果不希望外部类的用户能够独立于外部类创建内部类的项,则可以始终隐藏构造函数并使用外部类中的工厂方法来创建内部类的元素。我经常使用这种结构。

类的内容应该是该类的实现细节。嵌套类是外部类的实现细节,还是仅仅将外部类用作方便的名称范围和发现机制

如果是前者,那么您不应该公开私有实现细节。如果它们是类的实现细节,则将它们设置为私有

如果是后者,那么您应该使用名称空间而不是外部类作为范围和发现机制


不管怎样,公共嵌套类都是一种糟糕的代码味道。我想有一个很好的理由来公开嵌套类。

我通常不同意Eric的观点

我通常考虑的是:最终用户应该使用类型名称<代码>控制电路>传感器>代码>。如果是“几乎从不,但是类型需要是公共的,这样做才有可能”,那么就选择内部类型。对于其他内容,请使用单独的类型

比如说,

public class Frobber {
    public readonly FrobType Standard = ...;
    public readonly FrobType Advanced = ...;

    public void Frob(FrobType type) { ... }

    public class FrobType { ... }
}
在本例中,
FrobType
仅充当不透明的“东西”。只有
Frobber
需要知道它实际上是什么,尽管它需要能够在该类之外传递它。但是,这样的例子比较少,;通常,您应该避免嵌套的公共类


设计库时最重要的一点是保持库的简单。因此,请使用使库和使用代码更简单的任何方法。

从您对Eric答案的评论中:

这些传感器只能与特定电路一起使用

这种关系通常被称为依赖关系。
传感器
构造器应将
控制电路
作为参数。嵌套类不传递这种关系

不通过控制器电路,您无法获取/设置任何传感器设置

我认为这意味着所有
传感器
属性在使用时将委托给
控制电路(调用)或以某种方式通知(触发事件)。或者,你会有一些传感器的内部接口,只有控制电路使用,这使得
传感器
对于外部世界来说是一个不透明的类。如果是这种情况,
Sensor
只是一个实现细节,可以嵌套在私有或内部(如果您不能对传感器实例执行任何操作,也不需要“保存”它)

此外,我甚至不想公开传感器构造函数(控制器将为此提供一种方法)

传感器
构造器现在拥有一个控制电路,这一事实足以说明什么取决于你可以让构造器
公开
。您还可以将其设置为
内部


我的一般评论是,这种设计非常耦合。也许如果控制电路、传感器和设置之间有一些接口,就更容易独立地理解每个组件,设计也更易于测试。我总是发现明确每个组件所扮演的角色是有益的。也就是说,如果它们不仅仅是实现细节。

这个结构对我来说似乎完全合理。直到今天,我才意识到微软建议不要这样做,但我仍然不知道他们为什么这样建议

我在嵌套类只支持包含类(即它是其实现的一部分)的情况下使用了这种结构,但其他类需要能够看到它才能与包含类交互(即它是类的API的一部分)

话虽如此,Eric通常知道他在说什么,因此出于对他的知识的尊重,目前,我将这些类转换为使用名称空间

目前,我不喜欢这个结果。我有一个名为BasicColumn的类,它的存在只是为了表示一个名为Grid的类中的列。以前,那个班是
public class Frobber {
    public readonly FrobType Standard = ...;
    public readonly FrobType Advanced = ...;

    public void Frob(FrobType type) { ... }

    public class FrobType { ... }
}