閉じる

【C#】global usingの使い方:共通usingを1箇所にまとめて記述を削減

C# 10以降、開発効率を劇的に向上させる新機能としてglobal usingが導入されました。

プロジェクト内の全ソースファイルで共通して使用する名前空間を1か所に集約できるため、コードの可読性が向上し、ボイラープレートな記述を大幅に削減できます。

モダンなC#開発において、この機能を知っておくことはもはや必須と言えるでしょう。

本記事では、基本的な使い方から応用、さらには暗黙的なusingとの関係まで詳しく解説します。

global usingとは何か

従来のC#では、usingディレクティブはファイルごとに記述する必要がありました。

例えば、System.Collections.Genericを100個のファイルで使用する場合、100回同じ記述を書かなければなりませんでした。

この冗長さを解消するのがglobal usingです。

ファイル間での記述の共通化

global usingを使用すると、プロジェクト内の任意の1ファイルに記述した名前空間が、プロジェクト全体に適用されます。

これにより、各ファイルの冒頭がスッキリし、ロジックそのものに集中できる環境が整います。

特に大規模なプロジェクトでは、SystemSystem.LinqSystem.Threading.Tasksといった基本的な名前空間はほぼすべてのファイルで必要になります。

これらをグローバル化することで、メンテナンス性も向上します。

global usingの基本的な使い方

使い方は非常にシンプルです。

通常のusingの前にglobalというキーワードを付けるだけです。

共通ファイルにまとめる手法

一般的には、プロジェクトのルートディレクトリにGlobalUsings.csといった名前のファイルを作成し、そこにまとめて記述するのがベストプラクティスとされています。

C#
// GlobalUsings.cs
// プロジェクト全体で共有したい名前空間を定義します
global using System;
global using System.Collections.Generic;
global using System.Linq;
global using System.Text;
global using System.Threading.Tasks;

このように定義しておけば、他のファイル(例えば Program.csUser.cs)では、これらの名前空間をわざわざ宣言する必要がなくなります。

C#
// Program.cs
// using System; や using System.Linq; は不要です

var numbers = new List<int> { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(n => n % 2 == 0).ToList();

foreach (var n in evenNumbers)
{
    Console.WriteLine(n);
}

実行結果は以下の通りです。

実行結果
2
4

記述場所の自由度

global usingは、プロジェクト内のどのC#ファイルに記述しても機能します

しかし、あちこちのファイルに分散させてしまうと、どの名前空間がグローバル化されているのか把握しづらくなります。

そのため、前述したように専用の管理ファイルを作成することを強く推奨します。

暗黙的なusing (Implicit Usings)

C# 10および.NET 6以降では、global usingをさらに簡略化する「暗黙的なusing(Implicit Usings)」という機能も導入されました。

これは、プロジェクトファイル(.csproj)の設定によって、一般的な名前空間を自動的にグローバル化する仕組みです。

プロジェクトファイルでの設定

新しいプロジェクトを作成すると、デフォルトで以下の設定が含まれていることが多いです。

XML
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net8.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings> <!-- これが有効になっている -->
    <Nullable>enable</Nullable>
  </PropertyGroup>
</Project>

<ImplicitUsings>enable</ImplicitUsings>が設定されている場合、SDKの種類(コンソールアプリ、Webアプリなど)に応じて、よく使われる名前空間が自動的にインポートされます。

自動インポートされる名前空間の例

例えば、コンソールアプリケーション(Microsoft.NET.Sdk)の場合、以下の名前空間がデフォルトでグローバル化されます。

SDKタイプ自動的に追加される主な名前空間
Microsoft.NET.SdkSystem, System.Collections.Generic, System.IO, System.Linq, System.Net.Http, System.Threading, System.Threading.Tasks
Microsoft.NET.Sdk.Web上記に加え、Microsoft.AspNetCore.Builder, Microsoft.Extensions.DependencyInjectionなど
Microsoft.NET.Sdk.Worker上記に加え、Microsoft.Extensions.Hostingなど

自分で明示的にglobal usingを書かなくても、これらの名前空間が使えるのはこの機能のおかげです。

高度なglobal usingの活用

global usingは、単なる名前空間のインポート以外にも、static修飾子やエイリアスと組み合わせることが可能です。

global using static の活用

特定のクラスの静的メンバをプロジェクト全体で直接呼び出せるようにします。

例えば、System.Mathクラスをグローバルなスタティックインポートに設定してみましょう。

C#
// GlobalUsings.cs
global using static System.Math;
global using static System.Console;

このように設定すると、コード内でクラス名を省略してメソッドを呼び出せます。

C#
// どこかのファイル内
double result = Sqrt(144); // Math.Sqrt ではなく直接書ける
WriteLine($"結果は: {result}"); // Console.WriteLine ではなく直接書ける

実行結果は以下の通りです。

実行結果
結果は: 12

global using エイリアスの活用

名前空間の衝突を避けたり、長い名前空間を短縮したりする場合に便利です。

プロジェクト全体で特定の型に別名を付けたい場合に役立ちます。

C#
// GlobalUsings.cs
// 特定の型にプロジェクト全体で使える別名を付ける
global using ProjectDates = System.Collections.Generic.List<System.DateTime>;
C#
// 利用シーン
var dates = new ProjectDates();
dates.Add(DateTime.Now);

このように、global usingは柔軟に構成をカスタマイズできる強力なツールです。

メリットとデメリット

非常に便利な機能ですが、何でもかんでもグローバル化すれば良いというわけではありません。

メリットとデメリットを正しく理解しておきましょう。

メリット

ボイラープレートの削減

すべてのファイルの冒頭に同じ10〜20行のusingを書く手間がなくなります。

プロジェクトの一貫性

全ファイルで共通のユーティリティやライブラリが利用可能であることを保証できます。

コードのクリーン化

本質的なロジックのみが目に入るようになり、視認性が大幅に向上します。

デメリットと注意点

型の由来が不明瞭になる

ファイル単体を見たとき、どの名前空間からその型が来ているのかが分かりにくくなります。

IDE(Visual Studioなど)の機能を使えば解決できますが、テキストエディタで閲覧する際には不便になる可能性があります。

名前の衝突リスク

あまりにも多くの名前空間をグローバル化すると、異なる名前空間に存在する同名のクラス(例:Timer)で衝突が発生しやすくなります。

過剰な使用は避ける

本当にプロジェクト全体で使うものだけに限定すべきです。

特定の1〜2ファイルでしか使わないものは、通常通り各ファイルでusingするべきです。

global using導入のベストプラクティス

効果的に運用するためのポイントをまとめました。

1. 専用ファイル名は固定する

前述の通り、GlobalUsings.csという名前が一般的です。

チーム開発でも「ここを見れば共通設定がわかる」という共通認識を持てます。

2. 暗黙的なusingと併用する

.NETの標準的な名前空間はImplicitUsingsに任せ、プロジェクト固有のドメイン、共通ユーティリティ、外部ライブラリ(例:Newtonsoft.Jsonなど)のみをglobal usingで追加するのがスマートです。

3. ドメイン駆動設計(DDD)などでの活用

例えば、Domain.Modelsといったプロジェクト全体で頻繁に参照する内部名前空間をグローバル化すると、開発スピードが格段に上がります。

まとめ

global usingは、C#コードから冗長さを取り除き、開発者が本来集中すべきロジックの記述をサポートしてくれる素晴らしい機能です。

単に記述量が減るだけでなく、「プロジェクト全体の共通基盤」を明示的に定義できる点に大きな価値があります。

一方で、名前の衝突や定義場所の不明瞭化といったリスクも伴うため、GlobalUsings.csによる中央管理を徹底し、節度を持って活用することが大切です。

モダンな.NET開発においては、暗黙的なusingと独自のglobal usingを組み合わせて、「最小限の記述で最大限の表現」ができるクリーンなコードベースを目指しましょう。

クラウドSSLサイトシールは安心の証です。

URLをコピーしました!