Declare types in namespaces

TypeName

DeclareTypesInNamespaces

CheckId

CA1050

Category

Microsoft.Design

Breaking Change

Breaking

Cause

A public or protected type is defined outside the scope of a named namespace.

Rule Description

Types are declared within namespaces to prevent name collisions, and as a way of organizing related types in an object hierarchy. Types outside any named namespace are in a global namespace that cannot be referenced in code.

How to Fix Violations

To fix a violation of this rule, place the type in a namespace.

When to Exclude Warnings

While it is never necessary to exclude a warning from this rule, it is safe to do this when the assembly will never be used with other assemblies.

Example

The following example shows a library with a type incorrectly declared outside a namespace, and a type with the same name declared in a 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!";
      }
   }
}   

The following application uses the library defined previously. Note that the type declared outside a namespace is created when the name Test is not qualified by a namespace. Note also that to access the Test type in Goodspace, the namespace name is required.

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());
        }
    }
}

This example produces the following output.

Output

Test does not live in a namespace!
Test lives in a namespace!