CA1034:嵌套类型不应显示

时间:2010-05-04 05:39:41

标签: .net vb.net code-analysis

Here's对我试图理解的规则的解释。以下是代码分析器抱怨的简化代码:

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

如果枚举仅适用于类,为什么在类中使它成为包含类型是一件坏事?似乎比我更整洁......

有谁知道以下行是什么意思?:

嵌套类型包括成员可访问性的概念,一些程序员不明白

使用命名空间对类和枚举进行分组似乎不是解决此警告的有用方法,因为我希望枚举属于与类名相同的父级别。

3 个答案:

答案 0 :(得分:6)

枚举通常不会放在使用枚举的类中,因此人们不习惯指定枚举的位置:

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

将枚举放在类之外会使其更易于使用:

Dim speed As New CustomerSpeed(ProfitTypeEnum.FlatAmount)

枚举仍包含在与类相同的命名空间中。正如分析解释所指出的那样,您应该使用命名空间对公共成员进行分组,而不是将它们相互嵌套。

答案 1 :(得分:4)

除了其他响应中已涵盖的可用性和可发现性问题之外,还存在潜在的可维护性问题。当你发现你的枚举在其他地方也有用时会发生什么?将其移出其父类将是一个重大变化,复制它将引入其自身的可维护性问题,并要求API使用者与另一个类一起使用它开始变得丑陋。为什么不通过系统地避免嵌套枚举来避免这些潜在的问题?

答案 2 :(得分:1)

我猜这表明嵌套类型可能与静态变量混淆,因为它们都会在“。”之后出现在intellisense(自动完成)中。

即使您看到.NET的BCL(基类库),所有枚举,即使它们仅在一个类中使用,它们也不是嵌套的,原因是,当您想要比较或实例化时,类名+“。” +枚举名称会让人感到困惑,如下所示,微软也会认为它会让人感到困惑。

- 示例

class RootClass
{
   enum NestedEnum
   {
      StaticItem = 0     
   }

   static string NestedString = "";
}


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

一个是类型而另一个是可变的,大多数MS Code Analyzer警告是为了更好的设计,但它有一个很大的例外@George,如果你不喜欢它,不要使用它,只需继续并禁用警告。您当然可以使用大类名称而不是命名空间,这只是您的选择。但良好的编程技巧是关于别人如何完成你的代码而不是你喜欢的代码!!!

名称空间可以组织,通过组织我们输入更少,这就是更多的工作,更少的努力。但如果你喜欢打造大牌,没有人会阻止你。