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

属性
规则 ID CA1050
标题 在命名空间中声明类型
类别 设计
修复是中断修复还是非中断修复 重大
在 .NET 8 中默认启用 作为建议

原因

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

规则说明

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

如何解决冲突

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

何时禁止显示警告

虽然根本不必禁止显示此规则中的警告,但当程序集绝不会与其他组件一起使用时,可以禁止显示。

抑制警告

如果只想抑制单个冲突,请将预处理器指令添加到源文件以禁用该规则,然后重新启用该规则。

#pragma warning disable CA1050
// The code that's violating the rule is on this line.
#pragma warning restore CA1050

若要对文件、文件夹或项目禁用该规则,请在配置文件中将其严重性设置为 none

[*.{cs,vb}]
dotnet_diagnostic.CA1050.severity = none

有关详细信息,请参阅如何禁止显示代码分析警告

示例 1

以下示例显示在命名空间外错误声明类型的库,以及在名称空间中声明同一名称的类型。

// Violates rule: DeclareTypesInNamespaces.
using System;

public class Test
{
    public override string ToString()
    {
        return "Test does not live in a namespace!";
    }
}

namespace ca1050
{
    public class Test
    {
        public override string ToString()
        {
            return "Test lives in a namespace!";
        }
    }
}
' 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 ca1050

    Public Class Test

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

    End Class

End Namespace

示例 2

以下应用程序使用之前定义的库。 当命名空间未限定名称 Test 时,将创建命名空间之外声明的类型。 若要访问在命名空间内声明的 Test 类型,需要命名空间名称。

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

        ca1050.Test t2 = new ca1050.Test();
        Console.WriteLine(t2.ToString());
    }
}
Public Class MainHolder

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

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

End Class