我正在设计一个名为ScriptLib
的命名空间。在ScriptLib
内,我有一个基类Script
,其中包含一些派生类,包括但不限于SPoint
和SWhiteSpace
以及一个独立的类ScanGrid
。
namespace ScriptLib
{
public enum ScriptType { Point, WhiteSpace }
public enum BoundaryPointMode { FourPoints, TwoPoints }
public enum GridSizingMode { EqualInterval, EqualQuantity }
public class Script
{
public ScriptType ScriptType { get; set; }
//other properties and methods etc.
}
public class ScanGrid
{
public BoundaryPointMode BoundaryPointMode { get; set; }
public GridSizingMode GridSizingMode { get; set; }
//other properties and methods etc.
}
public sealed class SPoint : Script
{
public new ScriptType ScriptType => ScriptType.SPoint;
//other properties and methods etc.
}
public sealed class SWhiteSpace : Script
{
public new ScriptType ScriptType => ScriptType.WhiteSpace;
//other properties and methods etc.
}
//more classes derive from Script and all use ScriptType
}
Script
及其所有派生类使用ScriptType
,而ScanGrid
使用其他两个枚举。
目前我将它们放在命名空间内但在课外。但是,我觉得我以这种方式污染命名空间,因为所有类都没有使用枚举。请注意,我才开始使用此命名空间;会有更多的课程和词汇。
但是,如果我将ScriptType
放在Script
类中,而另外两个放在ScanGrid
中,则会导致命名问题。我想保留属性的名称,所以我需要为枚举设置新的名称。我是否将它们命名为:ScriptTypeType
,BoundaryPointModeType
和GridSizingModeType
?对我来说,他们不仅读得很糟糕,而且看起来也太长了,尤其是ScanGrid
。对以下代码进行成像:
scanGrid.GridSizingMode = _equalInterval.Checked ?
ScanGrid.GridSizingModeType.EqualInterval:
ScanGrid.GridSizingModeType.EqualQuantity
将枚举直接放在命名空间下是否常见,即使它们未被同一命名空间中的所有类使用?
如果我将它们放在类中,是否有一种命名枚举并引用它们的好方法?
答案 0 :(得分:1)
首先,这是来自nested types usage guidelines的引用:
不要将公共嵌套类型用作逻辑分组构造;使用 这个名称空间。
避免公开暴露的嵌套类型。唯一的 例外情况是需要嵌套类型的变量 在少数情况下声明,例如子类或其他高级 定制方案。
所以基本上把枚举放到类中只是为了从命名空间中删除它们是个坏主意。通过公共成员公开嵌套枚举也是个坏主意 - 你有嵌套枚举类型的 public 属性。现在回到你的问题:
但是,我觉得我以这种方式污染命名空间,因为枚举是 并非所有班级都使用。
当您在某个命名空间中声明某些枚举(或其他类型)时,并不意味着该枚举应由该命名空间中的所有类使用。例如。 DayOfWeek
命名空间中有枚举System
。并且System
命名空间中的所有类都没有使用它。大多数这些课程都没有使用它。
但是,如果我将ScriptType放在Script类中,而另一个放在Script类中 两个在ScanGrid中,它会导致命名问题。
您有这个命名问题,因为您使用的是嵌套类型,因为它们不应该被使用。但是你可以用C#6 using static directive来简化你的生活。 :
using static ScriptLib.Script;
该指令导入直接包含在类型声明中的静态成员和嵌套类型。因此,您将能够使用没有名称限定的嵌套类型:
scanGrid.GridSizingMode = _equalInterval.Checked
? GridSizingModeType.EqualInterval
: GridSizingModeType.EqualQuantity