2010-05-04 22 views
6

Here's解釋我正試圖理解的規則。下面是簡單的代碼,該代碼分析器在抱怨:CA1034:嵌套類型不應該是可見的

Public Class CustomerSpeed 

    Public Enum ProfitTypeEnum As Integer 
     NotSpecified = 0 
     FlatAmount = 1 
     PercentOfProfit = 2 
    End Enum 

    Private _ProfitTypeEnum As ProfitTypeEnum 

    Public Sub New(ByVal profitType As ProfitTypeEnum) 

     _ProfitTypeEnum = profitType 

    End Sub 

End Class 

如果枚舉只適用於類,爲什麼是一件壞事做它的類內包含的類型?整潔在我看來,...

有誰知道什麼是以下行?:

嵌套類型包括成員無障礙的概念,其中有些程序員不瞭解清楚

使用的意思命名空間將Class和Enum分組看起來似乎不是解決此警告的有用方法,因爲我希望枚舉兩者都屬於與類名相同的父級別。

回答

4

除了其他響應中已經涵蓋的可用性和可發現性問題之外,還存在潛在的可維護性問題。當你發現你的枚舉在其他地方也可能有用時,會發生什麼?將它從父類中移出將是一個重大改變,複製它會引入它自己的可維護性問題,並要求API消費者在另一個類中使用它會變得很難看。爲什麼不繫統地避免嵌套的枚舉來避免這些潛在的問題?

+0

正如你所知道的,如果你對我寫的內容足夠了解,我沒有購買發現能力或可用性的論據,因爲在Intellisense和VS2005一樣工作,而不是2010年,我認爲這兩者都不是問題。但是你的新朋友,我絕對同意。我確實考慮過自己的問題,但由於沒有被任何人提出而失去了重點。我必須承認沒有爲這個論點辯護,也不希望稍後有一個,所以......我單憑這個基礎確信。這似乎是足夠的理由不在類中嵌入枚舉。謝謝! – ChadD 2010-05-04 16:02:05

1

我想它表明嵌套類型可以與靜態變量混淆,因爲它們都會出現在「。」之後的智能感知(自動完成)中。

即使您看到.NET的BCL(基類庫),即使它們只用於一個類中,它們也不是嵌套的,原因是,當您想要比較或實例化時,該類名稱+「。」如下圖所示,+枚舉名稱會令人困惑,而且微軟認爲它會混淆人們。

- 實例

class RootClass 
{ 
    enum NestedEnum 
    { 
     StaticItem = 0  
    } 

    static string NestedString = ""; 
} 


RootClass.NestedEnum <-- represents enum, 
RootClass.NestedString <-- represents static variable 

一個是類型等是可變的,大多數MS代碼分析器警告是爲了更好的設計,但是它有一個@George大例外,如果你不喜歡它,不使用它,只需繼續並禁用警告即可。您當然可以使用大類名稱而不是名稱空間,它只是您的選擇。但良好的編程技巧是關於其他人如何獲得您的代碼而不是您喜歡的東西!

而命名空間在那裏組織和組織我們輸入較少,這就是所有關於做更多的工作與較少的努力。但是如果你喜歡打大字,沒有人阻止你。

+0

更大的類型?人,.NET框架是一個巨大的命名空間樹。爲什麼使用命名空間時,這導致人們輸入更多?答案是,我會想,「組織他們,讓你可以找到東西!」爲什麼類中的枚舉有什麼不同?他們推薦的解決方案是使用命名空間來組織。這種方法不會減少所需的打字量,但由於某種原因它是「首選」。所以,在你打字的打字點上,我不會購買它。至於混淆嵌套類型與靜態類型 - 不知道我明白。通過靜態ttype,你的意思是,例如,一個常數?枚舉是一個常量! – ChadD 2010-05-04 05:50:46

+0

是的,我意識到我可以禁用它,我質疑這一點,並使用代碼分析器,以便我可以提高我的編程技能。你看到我的屏幕?在VS2005中,intellisense爲你打字。我沒有讓你關於枚舉與靜態var有關。與任何方法一樣,您必須查看顯示在工具提示中的函數的返回類型。你可以有一個函數RootClass類,它返回anotehr對象類型,這是否令人困惑,我們應該警告它?沒有。 MS只需要讓智能感知工作就像它在我的屏幕上投射一樣。這是一個有用的.. – ChadD 2010-05-04 06:24:10

+0

..feature嵌入。他們的解決方案是使用命名空間,所以你打字太多的觀點不能成立。我懷疑你的可能是正確的(只是因爲我在這裏是少數),但我認爲你沒有提出正確的理由,或者我是誤解。 – ChadD 2010-05-04 06:26:34

6

枚舉通常不被放置在使用它們的類,所以人們不習慣指定枚舉是:

Dim speed As New CustomerSpeed(CustomerSpeed.ProfitTypeEnum.FlatAmount) 

配售枚舉外的類使得它更容易使用:

Dim speed As New CustomerSpeed(ProfitTypeEnum.FlatAmount) 

枚舉仍包含在與類相同的名稱空間中。正如分析說明指出的那樣,您應該使用名稱空間來將公共成員分組,而不是將它們彼此嵌套。

+0

嗯,我更喜歡你的答案,但我想我不同意你和MS,這種嵌入枚舉類是不好的,因爲它會讓不習慣嵌入類的枚舉的人混淆。我認爲解決方案是明確表示枚舉是嵌入的(如果是這樣),而不是反對它。它看起來像那些針對枚舉的intellisense不再是自動的。例如,在您鍵入的第一行代碼中,您實例化新的CustomerSpeed obj,而不管該枚舉是否嵌入,intellisense不會顯示僅限於枚舉值的窄選擇列表 – ChadD 2010-05-04 06:04:55

+0

..雖然intellisense向您顯示了預期的參數的合格名稱空間heirarchy,但它也可以通過僅提供ProfitTypeEnum類型值的選取列表來幫助您。它看起來好像Intellisense在VS2010上向後退了一步(在這種情況下,通常會有所改進) – ChadD 2010-05-04 06:07:14

+0

良好的智能感知(除已提供的參數工具提示信息外)可以解決用戶不希望限定枚舉的問題。嘿...只是試試這是2008年。我很確定它在2008年的作品,因爲我在2010年應該描述它。 – ChadD 2010-05-04 06:09:08

相關問題