名前空間の使用 (C# プログラミング ガイド)Using namespaces (C# Programming Guide)

C# プログラム内では名前空間が 2 つの方法でよく使用されます。Namespaces are heavily used within C# programs in two ways. 最初の方法では、.NET クラスで名前空間を使用して、その多くのクラスを整理します。Firstly, the .NET classes use namespaces to organize its many classes. 2 つ目の方法では、独自の名前空間を宣言します。これは、より大きなプログラミング プロジェクトでクラス名とメソッド名のスコープを制御するのに役立ちます。Secondly, declaring your own namespaces can help control the scope of class and method names in larger programming projects.

名前空間へのアクセスAccessing namespaces

ほとんどの C# アプリケーションは using ディレクティブのセクションから始まります。Most C# applications begin with a section of using directives. このセクションには、アプリケーションが頻繁に使用する名前空間がリストされ、包含されているメソッドが使用されるたびにプログラマが完全修飾名を指定しなくても済むようにします。This section lists the namespaces that the application will be using frequently, and saves the programmer from specifying a fully qualified name every time that a method that is contained within is used.

たとえば、次の行を記述したとします。For example, by including the line:

using System;

この場合、プログラムの開始位置で、以下のコードを使用できます。At the start of a program, the programmer can use the code:

Console.WriteLine("Hello, World!");

これは次のコードの代わりに使用します。Instead of:

System.Console.WriteLine("Hello, World!");

名前空間エイリアスNamespace aliases

using ディレクティブを使って、名前空間のエイリアスを作成することもできます。You can also use the using directive to create an alias for a namespace. エイリアス化された名前空間のメンバーにアクセスするには、名前空間エイリアス修飾子 :: を使います。Use the namespace alias qualifier :: to access the members of the aliased namespace. 次の例では、名前空間エイリアスを作成して使用する方法を示します。The following example shows how to create and use a namespace alias:

using generics = System.Collections.Generic;

namespace AliasExample
{
    class TestClass
    {
        static void Main()
        {
            generics::Dictionary<string, int> dict = new generics::Dictionary<string, int>()
            {
                ["A"] = 1,
                ["B"] = 2,
                ["C"] = 3
            };

            foreach (string name in dict.Keys)
            {
                System.Console.WriteLine($"{name} {dict[name]}");
            }
            // Output:
            // A 1
            // B 2
            // C 3
        }
    }
}

名前空間を用いたスコープの制御Using namespaces to control scope

namespace キーワードを使用して、スコープを宣言します。The namespace keyword is used to declare a scope. プロジェクト内でスコープを作成すると、コードの編成が容易になり、グローバルに一意の型を作成できます。The ability to create scopes within your project helps organize code and lets you create globally-unique types. 次の例では、入れ子関係にある 2 つの名前空間で SampleClass というクラスを定義します。In the following example, a class titled SampleClass is defined in two namespaces, one nested inside the other. . トークンを使用して、呼び出されるメソッドを区別します。The . token is used to differentiate which method gets called.

namespace SampleNamespace
{
    class SampleClass
    {
        public void SampleMethod()
        {
            System.Console.WriteLine(
              "SampleMethod inside SampleNamespace");
        }
    }

    // Create a nested namespace, and define another class.
    namespace NestedNamespace
    {
        class SampleClass
        {
            public void SampleMethod()
            {
                System.Console.WriteLine(
                  "SampleMethod inside NestedNamespace");
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // Displays "SampleMethod inside SampleNamespace."
            SampleClass outer = new SampleClass();
            outer.SampleMethod();

            // Displays "SampleMethod inside SampleNamespace."
            SampleNamespace.SampleClass outer2 = new SampleNamespace.SampleClass();
            outer2.SampleMethod();

            // Displays "SampleMethod inside NestedNamespace."
            NestedNamespace.SampleClass inner = new NestedNamespace.SampleClass();
            inner.SampleMethod();
        }
    }
}

完全修飾名Fully qualified names

名前空間と型には、論理階層を示す完全修飾名で表された一意のタイトルが割り当てられています。Namespaces and types have unique titles described by fully qualified names that indicate a logical hierarchy. たとえば、ステートメント A.B は、A が名前空間または型の名前であり、B はその内部で入れ子になっていることを意味します。For example, the statement A.B implies that A is the name of the namespace or type, and B is nested inside it.

入れ子になっているクラスと名前空間を次の例に示します。In the following example, there are nested classes and namespaces. 完全修飾名は、各エンティティの後のコメントとして示されています。The fully qualified name is indicated as a comment following each entity.

namespace N1     // N1
{
    class C1      // N1.C1
    {
        class C2   // N1.C1.C2
        {
        }
    }
    namespace N2  // N1.N2
    {
        class C2   // N1.N2.C2
        {
        }
    }
}

上のコード セグメントの各要素の意味は次のとおりです。In the previous code segment:

  • 名前空間 N1 はグローバル名前空間のメンバーです。The namespace N1 is a member of the global namespace. その完全修飾名は N1 です。Its fully qualified name is N1.

  • 名前空間 N2N1 のメンバーです。The namespace N2 is a member of N1. その完全修飾名は N1.N2 です。Its fully qualified name is N1.N2.

  • クラス C1N1 のメンバーです。The class C1 is a member of N1. その完全修飾名は N1.C1 です。Its fully qualified name is N1.C1.

  • クラス名 C2 は、このコードでは 2 回使用されています。The class name C2 is used two times in this code. ただし、完全修飾名は異なります。However, the fully qualified names are unique. C2 の最初のインスタンスは C1 内で宣言されているため、その完全修飾名は N1.C1.C2 となります。The first instance of C2 is declared inside C1; therefore, its fully qualified name is: N1.C1.C2. C2 の 2 つ目のインスタンスは名前空間 N2 内で宣言されているため、その完全修飾名は N1.N2.C2 となります。The second instance of C2 is declared inside a namespace N2; therefore, its fully qualified name is N1.N2.C2.

上のコード セグメントを使用して、次のように新しいクラス メンバー C3 を名前空間 N1.N2 に追加することができます。Using the previous code segment, you can add a new class member, C3, to the namespace N1.N2 as follows:

namespace N1.N2
{
    class C3   // N1.N2.C3
    {
    }
}

通常、名前空間エイリアス修飾子 :: は名前空間エイリアスを参照するために使い、global:: はグローバル名前空間を参照するために使います。. は型またはメンバーを修飾するために使います。In general, use the namespace alias qualifier :: to reference a namespace alias or global:: to reference the global namespace and . to qualify types or members.

名前空間ではなく型を参照するエイリアスで :: を使用するのは誤りです。It is an error to use :: with an alias that references a type instead of a namespace. 次に例を示します。For example:

using Alias = System.Console;
class TestClass
{
    static void Main()
    {
        // Error
        //Alias::WriteLine("Hi");

        // OK
        Alias.WriteLine("Hi");
    }
}

global という語は定義済みのエイリアスではないため、global.X には特別な意味がないことに注意してください。Remember that the word global is not a predefined alias; therefore, global.X does not have any special meaning. :: と共に使用したときにのみ特別な意味が与えられます。It acquires a special meaning only when it is used with ::.

global:: は常にグローバル名前空間を参照し、エイリアスを参照しないので、global という名前のエイリアスを定義すると、コンパイラ警告 CS0440 が生成されます。Compiler warning CS0440 is generated if you define an alias named global because global:: always references the global namespace and not an alias. たとえば、次のコード行では警告が生成されます。For example, the following line generates the warning:

using global = System.Collections;   // Warning

エイリアスで :: を使用することをお勧めします。そうすれば、追加の型が予想外に導入されることを防ぐことができます。Using :: with aliases is a good idea and protects against the unexpected introduction of additional types. たとえば、次の例について考えてみます。For example, consider this example:

using Alias = System;
namespace Library
{
    public class C : Alias::Exception { }
}

このコードは動作しますが、Alias という名前の型が後で導入された場合、Alias. は代わりにその型にバインドされます。This works, but if a type named Alias were to subsequently be introduced, Alias. would bind to that type instead. Alias::Exception を使用すれば、Alias は名前空間エイリアスとして扱われ、型と間違われることがなくなります。Using Alias::Exception ensures that Alias is treated as a namespace alias and not mistaken for a type.

関連項目See also