CA1050:在命名空间中声明类型

类型名

DeclareTypesInNamespaces

CheckId

CA1050

类别

Microsoft.Design

是否重大更改

原因

在命名的命名空间范围之外定义了公共或受保护类型。

规则说明

应在命名空间内声明类型以避免名称冲突,并作为一种在对象层次结构中组织相关类型的方式。位于任何命名的命名空间之外的类型属于全局命名空间,全局命名空间无法在代码中引用。

如何解决冲突

要修复与该规则的冲突,请将类型置于命名空间中。

何时禁止显示警告

尽管永远无需禁止显示此规则发出的警告,但是如果该程序集永远都不会与其他程序集一起使用,则可以安全地禁止显示警告。

示例

下面的示例演示一个库,该库包含一个错误地在命名空间外进行声明的类型,以及一个在命名空间内声明的同名类型。

Imports System 

' Violates rule: DeclareTypesInNamespaces. 
Public Class Test     

    Public Overrides Function ToString() As String         
        Return "Test does not live in a namespace!"     
    End Function  

End Class  

Namespace GoodSpace  

    Public Class Test 

        Public Overrides Function ToString() As String             
            Return "Test lives in a namespace!"         
        End Function   

    End Class  

End Namespace
using System;

// Violates rule: DeclareTypesInNamespaces. 
public class Test
{
   public override string ToString()
   {
      return "Test does not live in a namespace!";
   }
}

namespace GoodSpace
{
   public class Test
   {
      public override string ToString()
      {
         return "Test lives in a namespace!";
      }
   }
}   

下面的应用程序使用前面定义的库。请注意,当名称 Test 未使用命名空间进行限定时,会创建在命名空间外声明的类型。另外请注意,若要在 Goodspace 中访问 Test 类型,命名空间名称是必需的。

Imports System

Namespace ApplicationTester

    Public Class MainHolder

        Public Shared Sub Main()
            Dim t1 As New Test()
            Console.WriteLine(t1.ToString())

            Dim t2 As New GoodSpace.Test()
            Console.WriteLine(t2.ToString())
        End Sub 

    End Class 

End Namespace
using System;

namespace ApplicationTester
{
    public class MainHolder
    {
        public static void Main()
        {
            Test t1 = new Test();
            Console.WriteLine(t1.ToString());

            GoodSpace.Test t2 = new GoodSpace.Test();
            Console.WriteLine(t2.ToString());
        }
    }
}