2017-04-12 87 views
2

我正在設計名爲ScriptLib的名稱空間。在ScriptLib內部,我有一個基類Script與幾個派生類,包括但不限於SPointSWhiteSpace和獨立類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中,則會導致命名問題。我想保留屬性的名稱,所以我需要爲枚舉提供新名稱。我是否將它們命名爲:ScriptTypeTypeBoundaryPointModeTypeGridSizingModeType?對我來說,他們不僅讀得不好,而且看起來太長,尤其是ScanGrid。成像下面的代碼:

scanGrid.GridSizingMode = _equalInterval.Checked ? 
    ScanGrid.GridSizingModeType.EqualInterval: 
    ScanGrid.GridSizingModeType.EqualQuantity 

它是常見的,直接把枚舉,即使他們不在同一個命名空間中使用的所有類的命名空間下?

是否有一種很好的方法來命名枚舉並引用它們,如果我將它們放在類中?

+3

您可以(並且在我看來:應該)爲每個枚舉和類創建不同的文件以保持其清潔。這樣它就不會看起來'污染'了。你仍然可以將它們全部放在同一個命名空間中。 – Fortega

+2

這是來自你的域的一個概念,讓它在一個適當的命名空間中不會「污染」它。正如你已經注意到自己這是一個基於意見的問題,因此投票結束。 – BartoszKP

+0

@BartoszKP不知道基於意見的帖子是不允許在這裏。我可能也誤解了「污染」某些東西的意思。 – Anthony

回答

1

首先,這裏是從nested types usage guidelines報價:

不要使用公共嵌套類型的邏輯分組結構;爲此使用 名稱空間。

避免公開暴露的嵌套類型。唯一的 例外情況是嵌套類型的變量需要爲 ,這些變量在罕見場景(如子類或其他高級 自定義場景)中聲明。

所以基本上把枚舉放到類中只是爲了將它們從命名空間中刪除是個壞主意。另外,通過公共成員公開嵌套枚舉是個壞主意 - 你有public嵌套枚舉類型的屬性。現在回到你的問題:

但是,我覺得我這樣污染命名空間,因爲枚舉是 沒有被所有類使用。

當您在某些名稱空間中聲明某些枚舉(或其他類型)時,並不意味着該枚舉應該被該名稱空間中的所有類使用。例如。在System名稱空間中有枚舉DayOfWeek。而System命名空間中的所有類都不使用它。它甚至沒有被大多數這些類使用。

但是,如果我將ScriptType放置在ScanGrid中的Script類和其他 兩個中,則會導致命名問題。

您有這個命名問題,因爲您使用嵌套類型,因爲它們不應該被使用。但是你可以用C#6 using static directive簡化你的生活。 :

using static ScriptLib.Script; 

該指令進口靜態成員和嵌套類型的類型聲明直接包含。因此,您將能夠使用沒有名稱限定的嵌套類型:

scanGrid.GridSizingMode = _equalInterval.Checked 
    ? GridSizingModeType.EqualInterval 
    : GridSizingModeType.EqualQuantity 
+1

所以解決方案是顯而易見的:將類枚舉留在外面。謝謝。你的回答是一個巨大的幫助。 – Anthony