using ディレクティブ

using ディレクティブを使用すると、その型の完全修飾名前空間を指定せずに、名前空間で定義された型を使用できます。 基本的な形式の場合、using ディレクティブでは、次の例に示すように 1 つの名前空間からすべての型をインポートします。

using System.Text;

using ディレクティブには、次の 2 つの修飾子を適用できます。

  • global 修飾子は、プロジェクト内のすべてのソース ファイルに同じ using ディレクティブを追加するのと同じ効果があります。 この修飾子は C# 10 で導入されました。
  • static 修飾子では、名前空間内の型をすべてインポートする代わりに、1 つの型から static メンバーと入れ子にされた型をインポートします。

両方の修飾子を組み合わせて、プロジェクト内のすべてのソース ファイルの型から静的メンバーをインポートすることができます。

"using エイリアス ディレクティブ" を使用して、名前空間または型のエイリアスを作成することもできます。

using Project = PC.MyCompany.Project;

''using エイリアス ディレクティブ'' では global 修飾子を使用することができます。

注意

using キーワードは、using ステートメントの作成にも使用します。ファイルやフォントなどの IDisposable オブジェクトを正しく処理できるようになります。 'using ステートメントの詳細については、「using ステートメント」を参照してください。

global 修飾子のない using ディレクティブのスコープは、それが示されるファイルです。

using ディレクティブは、次のように記述することができます。

  • ソース コード ファイルの先頭、任意の名前空間または型宣言の前。
  • 任意の名前空間内 (ただしその名前空間で宣言されている名前空間または型の前) で、global 修飾子が使用されていない限り (その場合、ディレクティブはすべての名前空間と型宣言の前に記述する必要があります)。

それ以外の場合は、コンパイラ エラー CS1529 が生成されます。

using ディレクティブを作成すると、名前空間内の型を、名前空間を指定することなく使用できます。 using ディレクティブでは、指定した名前空間に入れ子になった別の名前空間へのアクセスは許可されません。 名前空間は、ユーザー定義とシステム定義の 2 つのカテゴリに分類されます。 ユーザー定義の名前空間は、コードで定義された名前空間です。 システム定義の名前空間の一覧については、「.NET API ブラウザー」を参照してください。

global 修飾子

global 修飾子を using ディレクティブに追加すると、コンパイル内のすべてのファイル (通常はプロジェクト) に using が適用されます。 global using ディレクティブは C# 10 で追加されました。 構文は次のとおりです。

global using <fully-qualified-namespace>;

ここで fully-qualified-namespace は、名前空間を指定せずに型を参照できる名前空間の完全修飾名です。

global using ディレクティブは、任意のソース コード ファイルの先頭に指定できます。 1 つのファイル内のすべての global using ディレクティブは、以下のものの前に示される必要があります。

  • global 修飾子がないすべての using ディレクティブ。
  • ファイル内のすべての名前空間と型宣言。

任意のソース ファイルに global using ディレクティブを追加できます。 通常は、それらを 1 つの場所に保持したいと考えます。 global using ディレクティブの順序は、1 つのファイル内でもファイル間でも関係ありません。

global 修飾子は、static 修飾子と組み合わせることができます。 global 修飾子は、''using エイリアス ディレクティブ'' に適用できます。 いずれの場合も、ディレクティブのスコープは現在のコンパイル内のすべてのファイルとなります。 次の例では、System.Math で宣言されているすべてのメソッドを、プロジェクト内のすべてのファイルで使用できるようにします。

global using static System.Math;

プロジェクト ファイルに <Using> 項目を追加することで、名前空間をグローバルに含めることができるようになりました (例: <Using Include="My.Awesome.Namespace" />)。 詳細については、「<Using> 項目」を参照してください。

重要

.NET 6 の C# テンプレートでは "最上位レベルのステートメント" が使用されます。 .NET 6 に既にアップグレードしている場合、お使いのアプリケーションはこの記事のコードに一致しないかもしれません。 詳細については、「新しい C# テンプレートで、最上位レベルのステートメントが生成される」の記事を参照してください。

.NET 6 SDK により、次の SDK を使用するプロジェクトに対して "暗黙的な" global using ディレクティブ セットも追加されます。

  • Microsoft.NET.Sdk
  • Microsoft.NET.Sdk.Web
  • Microsoft.NET.Sdk.Worker

これらの暗黙的な global using ディレクティブには、プロジェクトの種類に応じて最も一般的な名前空間が含まれます。

詳細については、「暗黙的なディレクティブの使用」の記事を参照してください

static 修飾子

using static ディレクティブでは、型名を指定せずにアクセスできる静的メンバーおよび入れ子にされた型の型名を指定します。 構文は次のとおりです。

using static <fully-qualified-type-name>;

<fully-qualified-type-name> は、型名を指定せずに参照できる静的メンバーおよび入れ子にされた型の名前です。 完全修飾型名 (完全な名前空間名と型名) を指定しないと、C# によってコンパイラ エラー CS0246: "型または名前空間名 'type/namespace' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?)" が生成されます。

using static ディレクティブは、インスタンス メンバーがある場合でも、静的メンバーがあるすべての型 (または入れ子にされた型) に適用されます。 ただし、インスタンス メンバーは、型のインスタンスを通してのみ呼び出すことができます。

アクセスを型名で修飾することなく型の静的メンバーにアクセスできます。

using static System.Console;
using static System.Math;
class Program
{
    static void Main()
    {
        WriteLine(Sqrt(3*3 + 4*4));
    }
}

通常は、静的メンバーを呼び出すときに、型名とメンバー名を指定します。 同じ型名を繰り返し入力してその型のメンバーを呼び出すと、コードが冗長でわかりにくくなる可能性があります。 たとえば、次の Circle クラスの定義では、Math クラスの多くのメンバーを参照します。

using System;

public class Circle
{
   public Circle(double radius)
   {
      Radius = radius;
   }

   public double Radius { get; set; }

   public double Diameter
   {
      get { return 2 * Radius; }
   }

   public double Circumference
   {
      get { return 2 * Radius * Math.PI; }
   }

   public double Area
   {
      get { return Math.PI * Math.Pow(Radius, 2); }
   }
}

メンバーが参照されるたびに Math クラスを明示的に参照する必要がなくなれば、using static ディレクティブによって生成されるコードがより簡潔になります。

using System;
using static System.Math;

public class Circle
{
   public Circle(double radius)
   {
      Radius = radius;
   }

   public double Radius { get; set; }

   public double Diameter
   {
      get { return 2 * Radius; }
   }

   public double Circumference
   {
      get { return 2 * Radius * PI; }
   }

   public double Area
   {
      get { return PI * Pow(Radius, 2); }
   }
}

using static は、指定した型で宣言されているアクセス可能な静的メンバーおよび入れ子になった型のみをインポートします。 継承されたメンバーはインポートされません。 using static ディレクティブを使用して、Visual Basic モジュールを含む任意の名前付きの型からインポートすることができます。 F# の最上位の関数が、有効な C# 識別子を名前に持つ名前付きの型の静的メンバーとしてメタデータに存在する場合は、その F# 関数をインポートできます。

using static を使用すると、指定した型で宣言された拡張メソッドを拡張メソッドの参照で使用できるようになります。 ただし、コード内で修飾なしで参照している場合、拡張メソッドの名前はスコープにインポートされません。

同じコンパイル単位または名前空間の多様な using static ディレクティブによってさまざまな型からインポートされた同じ名前を持つメソッドが、メソッド グループを形成します。 これらのメソッド グループ内のオーバーロードの解決方法は、C# の通常の規則に従います。

次の例では、using static ディレクティブを使用して、Console クラス、Math クラス、および String クラスの静的メンバーを、型名を指定せずに使用できるようにしています。

using System;
using static System.Console;
using static System.Math;
using static System.String;

class Program
{
   static void Main()
   {
      Write("Enter a circle's radius: ");
      var input = ReadLine();
      if (!IsNullOrEmpty(input) && double.TryParse(input, out var radius)) {
         var c = new Circle(radius);

         string s = "\nInformation about the circle:\n";
         s = s + Format("   Radius: {0:N2}\n", c.Radius);
         s = s + Format("   Diameter: {0:N2}\n", c.Diameter);
         s = s + Format("   Circumference: {0:N2}\n", c.Circumference);
         s = s + Format("   Area: {0:N2}\n", c.Area);
         WriteLine(s);
      }
      else {
         WriteLine("Invalid input...");
      }
   }
}

public class Circle
{
   public Circle(double radius)
   {
      Radius = radius;
   }

   public double Radius { get; set; }

   public double Diameter
   {
      get { return 2 * Radius; }
   }

   public double Circumference
   {
      get { return 2 * Radius * PI; }
   }

   public double Area
   {
      get { return PI * Pow(Radius, 2); }
   }
}
// The example displays the following output:
//       Enter a circle's radius: 12.45
//
//       Information about the circle:
//          Radius: 12.45
//          Diameter: 24.90
//          Circumference: 78.23
//          Area: 486.95

上の例では、using static ディレクティブを Double 型に適用することもできます。 そのディレクティブを追加すると、型名を指定せずに TryParse(String, Double) メソッドを呼び出せるようになります。 ただし、どの数値型の using static メソッドが呼び出されたかを判断するために TryParse ディレクティブを確認する必要が出てくるため、型名のない TryParse を使用すると、コードが読みにくくなります。

using static は、enum 型にも適用されます。 列挙体に using static を追加することで、列挙型のメンバーを使用するために型が不要になります。

using static Color;

enum Color
{
    Red,
    Green,
    Blue
}

class Program
{
    public static void Main()
    {
        Color color = Green;
    }
}

using エイリアス

using 別名ディレクティブを作成すると、名前空間または型の識別子を修飾しやすくなります。 どの using ディレクティブでも、その前にある using ディレクティブに関係なく、完全修飾名前空間または型を使用する必要があります。 using ディレクティブの宣言内では、using 別名を使用することができません。 たとえば、次の例ではコンパイラ エラーになります。

using s = System.Text;
using s.RegularExpressions; // Generates a compiler error.

次の例は、名前空間の using エイリアスを定義して使用する方法を示しています。

namespace PC
{
    // Define an alias for the nested namespace.
    using Project = PC.MyCompany.Project;
    class A
    {
        void M()
        {
            // Use the alias
            var mc = new Project.MyClass();
        }
    }
    namespace MyCompany
    {
        namespace Project
        {
            public class MyClass { }
        }
    }
}

using エイリアス ディレクティブの右側には、オープン ジェネリック型を配置できません。 たとえば、List<T> に using エイリアスを作成することはできませんが、List<int> には作成できます。

次の例は、クラスの using ディレクティブと using エイリアスを定義する方法を示しています。

using System;

// Using alias directive for a class.
using AliasToMyClass = NameSpace1.MyClass;

// Using alias directive for a generic class.
using UsingAlias = NameSpace2.MyClass<int>;

namespace NameSpace1
{
    public class MyClass
    {
        public override string ToString()
        {
            return "You are in NameSpace1.MyClass.";
        }
    }
}

namespace NameSpace2
{
    class MyClass<T>
    {
        public override string ToString()
        {
            return "You are in NameSpace2.MyClass.";
        }
    }
}

namespace NameSpace3
{
    class MainClass
    {
        static void Main()
        {
            var instance1 = new AliasToMyClass();
            Console.WriteLine(instance1);

            var instance2 = new UsingAlias();
            Console.WriteLine(instance2);
        }
    }
}
// Output:
//    You are in NameSpace1.MyClass.
//    You are in NameSpace2.MyClass.

C# 12 以降では、タプル型、ポインター型、およびその他の安全でない型を含め、以前は制限されていた型に対してエイリアスを作成できます。 更新されたルールの詳細については、機能仕様のページを参照してください。

Visual Basic の My 名前空間を使用する方法

Microsoft.VisualBasic.MyServices 名前空間 (Visual Basic では My) を使用すると、いくつもの .NET クラスに簡単かつ直感的にアクセスでき、コンピューター、アプリケーション、設定、リソースなどと対話するコードを記述できます。 MyServices 名前空間は、もともとは Visual Basic で使用するものとして設計されましたが、C# アプリケーションでも使用できます。

Visual Basic で MyServices 名前空間を使用する方法の詳細については、My を使用した開発 に関するページを参照してください。

プロジェクト内の Microsoft.VisualBasic.dll アセンブリへの参照を追加する必要があります。 MyServices 名前空間のクラスの中には C# アプリケーションから呼び出すことができないクラスもあります。たとえば、FileSystemProxy クラスは、C# と互換性がありません。 そのような場合は、同様に VisualBasic.dll に含まれている FileSystem を構成する静的メソッドを代わりに使用できます。 このようなメソッドを使用してディレクトリを複製する方法を次に示します。

// Duplicate a directory
Microsoft.VisualBasic.FileIO.FileSystem.CopyDirectory(
    @"C:\original_directory",
    @"C:\copy_of_original_directory");

C# 言語仕様

詳細については、C# 言語仕様に関するページの using ディレクティブに関するセクションを参照してください。 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。

global using 修飾子の詳細については、global using 機能の仕様 - C# 10 に関するページを参照してください。

関連項目