using
ディレクティブ
using
ディレクティブを使用すると、その型の完全修飾名前空間を指定せずに、名前空間で定義された型を使用できます。 基本的な形式の場合、using
ディレクティブでは、次の例に示すように 1 つの名前空間からすべての型をインポートします。
using System.Text;
using
ディレクティブには、次の 2 つの修飾子を適用できます。
global
修飾子は、プロジェクト内のすべてのソース ファイルに同じusing
ディレクティブを追加するのと同じ効果があります。 この修飾子は C# 10 で導入されました。static
修飾子では、名前空間内の型をすべてインポートする代わりに、1 つの型からstatic
メンバーと入れ子にされた型をインポートします。
両方の修飾子を組み合わせて、静的メンバーを型からプロジェクト内のすべてのソース ファイルにインポートできます。
"using エイリアス ディレクティブ" を使用して、名前空間または型のエイリアスを作成することもできます。
using Project = PC.MyCompany.Project;
''using エイリアス ディレクティブ'' では global
修飾子を使用することができます。
Note
using
キーワードは、"using
ステートメント" の作成にも使われ、ファイルやフォントなどの IDisposable オブジェクトが正しく処理されるのに役立ちます。 "using
ステートメント" について詳しくは、「using
ステートメント」をご覧ください。
global
修飾子のない using
ディレクティブのスコープは、それが示されるファイルです。
global using
ディレクティブは、すべての名前空間と型宣言の前に指定する必要があります。 グローバル using ディレクティブはすべて、非グローバル using
ディレクティブの前にソース ファイルに含める必要があります。
その他の using
ディレクティブが表示される場合があります。
- ソース コード ファイルの先頭、任意の名前空間または型宣言の前。
- ブロックスコープの名前空間で、その名前空間で宣言されている名前空間または型の前。
それ以外の場合は、コンパイラ エラーが生成されます。
using
ディレクティブを作成すると、名前空間内の型を、名前空間を指定することなく使用できます。 using
ディレクティブでは、指定した名前空間に入れ子になった別の名前空間へのアクセスは許可されません。 名前空間は、ユーザー定義とシステム定義の 2 つのカテゴリに分類されます。 ユーザー定義の名前空間は、コードで定義された名前空間です。 システム定義の名前空間の一覧については、「.NET API ブラウザー」を参照してください。
global
修飾子
global
修飾子を using
ディレクティブに追加すると、コンパイル内のすべてのファイル (通常はプロジェクト) に using が適用されます。 global using
ディレクティブは C# 10 で追加されました。 構文は次のとおりです。
global using <fully-qualified-namespace>;
完全に修飾された名前空間は、名前空間を指定せずに型を参照できる名前空間の完全修飾名です。
global using ディレクティブは、任意のソース コード ファイルの先頭に指定できます。 1 つのファイル内のすべての global using
ディレクティブは、以下のものの前に示される必要があります。
global
修飾子がないすべてのusing
ディレクティブ。- ファイル内のすべての名前空間と型宣言。
任意のソース ファイル global using
ディレクティブを追加できます。 通常は、1 つの場所に保持する必要があります。 global using
ディレクティブの順序は、1 つのファイル内でもファイル間でも関係ありません。
global
修飾子は、static
修飾子と組み合わせることができます。 global
修飾子は、使用するエイリアス ディレクティブに適用できます。 いずれの場合も、ディレクティブのスコープは現在のコンパイル内のすべてのファイルとなります。 次の例では、System.Math で宣言されているすべてのメソッドを、プロジェクト内のすべてのファイルで使用できるようにします。
global using static System.Math;
プロジェクト ファイルに <Using>
項目を追加することで、名前空間をグローバルに含めることができるようになりました (例: <Using Include="My.Awesome.Namespace" />
)。 詳細については、「<Using>
項目」を参照してください。
異なる場所でディレクティブを使用して global
を複製すると、アナライザーによって診断が発行されます。 これらの同じアナライザーは、global
using ディレクティブが既に参照している名前空間または型のusing
ディレクティブを追加した場合にも通知します。 プロジェクト内の 1 つのファイルにまとめることで、 global
の使用を簡単に管理できる場合があります。
重要
.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 以降では、タプル型、ポインター型、およびその他の安全でない型を含め、以前は制限されていた型に対してエイリアスを作成できます。 更新されたルールの詳細については、機能仕様のページを参照してください。
修飾されたエイリアス メンバー
名前空間エイリアス修飾子 ::
は、他のエンティティによって隠されている可能性があるエイリアスを使用して、グローバル名前空間またはその他への明示的なアクセスを提供します。
global::
により、::
トークンに続く名前空間の名前空間検索がグローバル名前空間に対して相対的になります。 それ以外の場合、トークンは using エイリアスに解決され、 ::
に続くトークンはそのエイリアス化された名前空間の型に解決される必要があります。 次の例は、両方のフォームを示しています。
using S = System.Net.Sockets;
class A
{
public static int x;
}
class C
{
public void F(int A, object S)
{
// Use global::A.x instead of A.x
global::A.x += A;
// Using ::, S must resolve to a namespace alias:
S::Socket s = S as S::Socket;
// In this form, if S were a class, it would be a compile-time error:
S.Socket s1 = S as S.Socket;
}
}
C# 言語仕様
詳細については、C# 言語仕様に関するページの using ディレクティブに関するセクションを参照してください。 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。
global using 修飾子の詳細については、global using 機能の仕様 - C# 10 に関するページを参照してください。
関連項目
.NET