おーみんブログ

C#, ASP.NET Core, Unityが大好きです。

C#10のglobal usingを体験してみた。

はじめに

C#10にて、プロジェクト全体に対してusing機能が有効になるglobal usingというものが追加されたというお話を見たので実際に体験してみました。

medium.com

環境構築

環境は以下です。 (今回の環境構築ではDockerを用いています)

  • Windows10 Pro
  • Docker Version 19.03.12
C:\Work>docker -v
Docker version 19.03.12, build 48a66213fe
C:\Work>ver
Microsoft Windows [Version 10.0.19042.1165]

imageは以下の.NET 6.0 Preview Tagsを利用しています。

hub.docker.com

コンテナを立ち上げます。 (ローカルにc:\Work\Docker_.Net6Previewフォルダを作成しています。こちらはDockerコンテナのフォルダをマウントするためなので名前は任意のもので大丈夫かと思います)

C:\Work>docker run -it -p 5000:5000 -v c:\Work\Docker_.Net6Preview:/src mcr.microsoft.com/dotnet/sdk:6.0

上記のようにコンテナを立ち上げてコンテナのsrcフォルダで以下のコマンドを打ち、コンソールアプリを立ち上げます。

root@d885685e4c2a:/src# dotnet new console

サンプルコード(従来)

マウントしたローカルのc:\Work\Docker_.Net6Previewフォルダを開くとコンソールアプリのテンプレートが出来ていると思うのでそちらでサンプルコードを書いていきましょう。

まずは普通にusingを利用します。

using Tests;
using Tests2;

namespace ConsoleApp
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var a = Test1.GetString("GetString");
            Console.WriteLine(a);    // <-- "GetString"と出力される

            var b = Test2.GetString2();
            Console.WriteLine(b);    // <-- "GetString2"と出力される
        }
    }
}
namespace Tests
{
    public class Test1
    {
        public static string GetString(string str)
        {
            return str;
        }
    }
}
using Tests;

namespace Tests2
{
    public class Test2
    {
        public static string GetString2()
        {
            return Test1.GetString("GetString2");
        }
    }
}

Test1クラスのGetStringメソッドは引数をそのまま返却し、Test2クラスのGetString2メソッドはTest1クラスのGetStringメソッドを用いて"GetString2"という文字列を返却します。

今回はこちらのサンプルコードにglobal using機能を使っていきます。

サンプルコード(global using利用)

Program.csの「using Tests;」部分を「global using Tests;」へ変更し、Tests2.csのusingはコメントアウトします。 Tests.csについては特に変更していません。

global using Tests; //<-- globalを追加。
using Tests2;

namespace ConsoleApp
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var a = Test1.GetString("GetString");
            Console.WriteLine(a);    // <-- "GetString"と出力される

            var b = Test2.GetString2();
            Console.WriteLine(b);    // <-- "GetString2"と出力される
        }
    }
}
//using Tests;  <-- Program.csでglobal usingをしているのでコメントアウト(削除)しても大丈夫

namespace Tests2
{
    public class Test2
    {
        public static string GetString2()
        {
            return Test1.GetString("GetString2");
        }
    }
}

こちらでビルド / 実行して問題なく"GetString"と"GetString2"が出力されます。

おわりに

C#10で搭載される予定のglobal usingを実際に体験してみました。 C#10ではまだまだたくさんの機能が搭載される予定なのでどんどん触っていこうと思います(^^♪