C# using

C#

C#のusingティレクティブはC#を使ったことがあれば誰でもおなじみですが、実は色々な使い方があります。

基本的なusing ディレクティブ

まずusing ディレクティブの最も基本的な使い方は、一つの特定の名前空間からすべての型をインポートします。結果としてその型の完全修飾名前空間を省略して、その名前空間内で定義された型を使用できます。

C#
using System.Text;

global using

usingにglobalをつけると、コンパイル対象(プロジェクト)の全体に対してusingが適用されます。

C#10以降では、ImplicitUsingというプロジェクトのMSBuildのプロパティがenableに設定されていると、以下のようなglobal usingが自動的に追加され、プロジェクト内の他のファイルでこれを使うことができます。例えば、using System; を各ファイルで記述する必要はありません。

C#
global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Threading;
global using global::System.Threading.Tasks;

ユーザー定義の名前空間ももちろんglobal usingすることができます。

C#
global using DataExample;

namespace DataExample
{
    public class DataStore
    {
        public static DataStore Create(string name)
        {
            // ...
            return new DataStore();
        }
        // ...
    }
}

この例の名前空間DataExampleは、各ファイルでusing DataExample; を宣言しなくても、プロジェクト全体から参照できます。

globalエイリアス

C#
global using global::DataExample

この形式は、global::エイリアスを使用しています。この例では、DataExampleという名前空間がプロジェクト全体から参照できるようになります。

global::は、C#において「ルート名前空間」または「グローバル名前空間」を明示的に指定するためのキーワードです。 つまり、global::DataExampleは、「いかなる名前解決スコープの影響も受けずに、グローバルなスコープにあるDataExampleという名前空間を参照せよ」と明示的に指示しています。これは、例えば、自分のプロジェクト内にDataExampleというクラスや別の名前空間があり、それが本来参照したいDataExample名前空間と衝突するような場合に、曖昧さを避けるために使用されることがあります。

using static

C#の6.0以降で使える機能です。対象となる型の静的メンバーを型名を省略して記述できます。

C#
using System;
using static System.Math; 
using static System.Console;
using static DayOfWeek;

public class Example
{
    public static void Main()
    {
        // System.Console.WriteLine()
        WriteLine("Hello, World!");      
        double radius = 5.0;
        // System.Math.PI 
        double circumference = 2 * PI * radius;
        WriteLine($"円周: {circumference}");

        double angle = PI / 2;
        // System.Math.Sin()
        WriteLine($"sin({angle}) = {Sin(angle)}");
    }
}

この例では、System.Mathや、System.Console、Sytem.DayOfWeek(enum)の呼び出しを簡略化しています。このように頻繁に使う静的クラスのメンバーを簡略化して便利に使えます。

Usingエイリアス

使いどころは、以下のように名前が重複してどちらを参照すべきか曖昧な状態(ambiguity)になった場合の対応が挙げられます。エイリアスを使えばambiguity Errorは発生しません。

C#
using WinformTimer = System.Windows.Forms.Timer;
using ThreadingTimer = System.Threading.Timer;

あるいは、例えば、作成中のグラフィックライブラリMyGraphicsLibで特殊用途のPoint()を提議したとします。

C#
using System.Drawing;
using MyGraphicsLib; // これだけだとどちらのPointか不明確

public class MyClass
{
    public void DoSomething()
    {
        System.Drawing.Point p1 = new System.Drawing.Point(10, 20);
        SomeGraphicsLib.Point p2 = new MyGraphicsLib.Point(30, 40);
    }
}

このように同名のPointを使分けるには完全修飾名を使う必要があります。
このような場合には、以下のようにエイリアスを使えば、簡潔で明瞭に使い分けができます。

C#
using SDrawingPoint = System.Drawing.Point; 
using GLibPoint = SomeGraphicsLib.Point;     

public class MyClass
{
    public void DoSomething()
    {
        SDrawingPoint p1 = new SDrawingPoint(10, 20);
        GLibPoint p2 = new GLibPoint(30, 40);
    }
}

コメント

タイトルとURLをコピーしました