using static ディレクティブ (C# リファレンス)

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

using static <fully-qualified-type-name>

fully-qualified-type-name は、型名を指定せずに参照できる静的メンバーの型の名前です。 完全修飾型名 (完全な名前空間名と型名) を指定しないと、C# によってコンパイラ エラー CS0246 "型または名前空間の名前 '' が見つかりませんでした" が生成されます。

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

using static ディレクティブは、C# 6 で導入されました。

コメント

通常は、静的メンバーを呼び出すときに、型名とメンバー名を指定します。 同じ型名を繰り返し入力してその型のメンバーを呼び出すと、コードが冗長でわかりにくくなる可能性があります。 たとえば、次の 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 型に適用することもできます。 それにより、型名を指定せずに、@System.Double.TryParse 型 (System.String,System.Double@) メソッドを呼び出せるようになります。 ただし、どの数値型の TryParse メソッドが呼び出されたかを判断するために using static ステートメントを確認する必要が出てくるため、コードが読みにくくなります。

関連項目

using ディレクティブ
C# リファレンス
C# のキーワード
名前空間の使用
名前空間キーワード
名前空間