xin9le.net

Microsoft の製品/技術が大好きな Microsoft MVP な管理人の技術ブログです。

静的メンバーへの簡易アクセス

C#で提供されているusingキーワードは「usingステートメント」と「usingディレクティブ」の2種類あります。このうちusingディレクティブは以下の2つの場合に利用できました。

  1. 名前空間の省略 (= 指定された名前空間内の型は名前空間を修飾しないで使用可能)
  2. 名前空間または型のエイリアスの作成 (= using alias directive)
using System;           //--- 1 : 名前空間しか指定できない
using M = System.Math;  //--- 2 : 名前空間でも型でも別名を定義できる

namespace Sample
{
    class Program
    {
        static void Main()
        {
            //--- System.Math は M と略しても良い
            var radius = 2;
            var area   = radius * radius * M.PI;

            //--- System.Console と書かなくても良い
            Console.WriteLine(area);
        }
    }
}

今回C# vNextでは、このusingディレクティブにさらにひとつ機能が追加されました。

Using static members

これまでのusingディレクティブでは名前空間しか省略の対象とできませんでしたが、using staticを利用することで型名の省略もできるようになりました。

using static System.Console;
using static System.DateTime;
using static CSharpVNext.Fruits;

namespace CSharpVNext
{
    enum Fruits
    {
        Apple,
        Banana,
    }

    class Program
    {
        static void Main()
        {
            WriteLine(Now);   //--- Console. (静的クラス) と DateTime. (構造体) を省略
            WriteLine(Apple); //--- 列挙体でもOK
        }
    }
}

複数の静的クラス内に同名のメンバーがあると、型名を省略してメンバーにアクセスした際にどちらを呼び出して良いか分からなくなるのでコンパイルエラーが出ます。また、拡張メソッドも適用外でエラーになります。

逆コンパイル結果

先の例を逆コンパイルしてみると以下のようになります。型名が省略されずに展開されていることが分かります。

using System;

namespace CSharpVNext
{
    internal class Program
    {
        private static void Main()
        {
            Console.WriteLine(DateTime.Now);
            Console.WriteLine(Fruits.Apple);
        }
    }
}