C#を用いた開発において、ファイルの先頭に並ぶ大量のusing句に煩わしさを感じたことはないでしょうか。
プロジェクトが大規模になるほど、同じ名前空間をすべてのファイルで宣言する作業は冗長になりがちです。
C# 10からは、この問題を劇的に解消する「global using」という機能が導入されました。
この機能を活用することで、プロジェクト全体で共通して使用する名前空間を一つの場所で定義し、個別のソースコードを驚くほどスッキリと保つことができます。
本記事では、global usingの具体的な使い方から、推奨される定義場所、そして導入時の注意点までを詳しく解説します。
global usingの基本概念
C# 10で導入されたglobal usingは、その名の通り「プロジェクト全体に対して有効なusing句」を定義する仕組みです。
従来のusing句は、記述したファイル内でのみ有効でしたが、global修飾子を付与することで、同一プロジェクト内のすべてのC#ファイルにその名前空間が自動的に適用されます。

なぜglobal usingが必要なのか
現代のC#開発、特に.NET 6以降では、簡潔なコード記述(ボイラープレートコードの削減)が重視されています。
例えば、SystemやSystem.Collections.Generic、System.Linqなどは、ほぼすべてのファイルで必要とされる名前空間です。
これらをファイルごとに記述するのは、開発者にとって付加価値のない作業です。
global usingを導入することで、以下のメリットが得られます。
- 各ファイルの冒頭がスッキリし、本来のロジックに集中できるようになる。
- 共通で使用するライブラリ(LoggingやDependency Injectionなど)の宣言を一括管理できる。
- プロジェクト全体のコーディング規約として、共通の名前空間を強制しやすくなる。
方法1:C#ファイル内でglobal usingを定義する
最も直感的で柔軟な方法は、プロジェクト内の任意のC#ファイル(.cs)にglobal usingを記述する方法です。
定義の記述例
特定のファイル(例:GlobalUsings.cs)を作成し、そこにプロジェクト全体で使いたい名前空間をまとめます。
// GlobalUsings.cs
// global修飾子を付けることで、プロジェクト内の全ファイルに適用されます
global using System;
global using System.Collections.Generic;
global using System.Linq;
global using System.Threading.Tasks;
global using Microsoft.Extensions.Logging;
// エイリアス(別名)もglobalとして定義可能です
global using MyProjectAlias = Project.SubNamespace.SpecificClass;
このように定義しておけば、他のファイル(例えば Program.cs や Services/UserService.cs)では、これらのusing句を書かなくても、そのままList<T>やILoggerを使用できます。
推奨される運用スタイル:GlobalUsings.csの作成
global usingは、技術的にはプロジェクト内のどのファイルに書いても動作します。
しかし、あちこちのファイルに分散させてしまうと、「どの名前空間がグローバルに定義されているのか」が分からなくなるという管理上の問題が発生します。
そのため、プロジェクトのルートディレクトリに「GlobalUsings.cs」という名前のファイルを一つ作成し、そこに集約させる運用が一般的であり、最も推奨されます。

方法2:プロジェクトファイル(.csproj)で定義する
C#ファイルを作成せずに、プロジェクト設定ファイル(.csproj)の中に直接記述する方法もあります。
.csprojへの記述方法
XML形式のプロジェクトファイルに<Using>要素を追加することで、ビルド時に自動的にglobal usingとして扱われるようになります。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<!-- ここに共通化したい名前空間を追加します -->
<ItemGroup>
<Using Include="System.Text.Json" />
<Using Include="MyApplication.Constants" />
<Using Static="true" Include="System.Math" />
<Using Include="MyNamespace.OldClass" Alias="NewAlias" />
</ItemGroup>
</Project>
ImplicitUsings(暗黙的なusing)との関係
.NET 6以降のテンプレートでは、<ImplicitUsings>enable</ImplicitUsings>という設定がデフォルトで有効になっています。
これは、プロジェクトの種類(Console, Web, Class Libraryなど)に応じて、標準的な名前空間をMicrosoft側が自動でglobal usingとして追加してくれる機能です。
例えば、Web SDKを使用している場合、Microsoft.AspNetCore.Builderなどは明示的に書かなくても最初からグローバルに参照可能です。
独自のusingを追加したい場合は、前述の<Using>タグを追記します。
| 定義方法 | メリット | デメリット |
|---|---|---|
| .csファイル | C#の構文で書ける、IDEの補完が効く、管理しやすい | ファイルを一つ作成する必要がある |
| .csprojファイル | プロジェクト構成として一元管理できる | XML形式なので少し書きづらい、IDEの補完が弱い |
global using static の活用
C#には、特定のクラスの静的メンバ(メソッドやプロパティ)を、クラス名を省略して呼び出せるusing staticという機能があります。
これもglobalと組み合わせることが可能です。
数学関数やユーティリティの共通化
例えば、数学的な計算を多用するプロジェクトでは、System.Mathをグローバルな静的usingとして定義すると便利です。
// GlobalUsings.cs
global using static System.Math;
global using static System.Console;
この定義により、プロジェクト内のあらゆる場所で以下のようなコードが記述可能になります。
// 本来は Math.PI や Math.Sin(x) と書く必要があるが、省略できる
double area = PI * Pow(radius, 2);
WriteLine($"計算結果: {area}"); // Console.WriteLineも省略可能
ただし、多用しすぎると「そのメソッドがどこで定義されているのか」が不明瞭になるため、System.Mathのような誰もが知っている標準クラスに限定するのが賢明です。

global usingを導入する際の注意点とトラブルシューティング
非常に便利なglobal usingですが、導入にあたってはいくつか注意すべき点があります。
1. 名前空間の衝突(アンビギュアス参照)
異なる名前空間に同じ名前のクラスが存在する場合、両方をglobal usingしてしまうとコンパイルエラーが発生します。
例えば、System.Timers.Timer と System.Threading.Timer の両方が必要な場合です。
この場合、どちらか一方(または両方)をグローバルにするのは避け、個別のファイルでエイリアスを使うか、完全修飾名(Namespace.ClassName)で記述する必要があります。
2. 可読性と「魔法」の副作用
global usingは、一見すると「どこにも定義されていないはずのクラスが突然使える」という状態を作り出します。
これは、新しくプロジェクトに参加したメンバーにとって、コードの依存関係を理解する妨げになる可能性があります。
- 対策: 「GlobalUsings.cs」という標準的な命名を徹底し、プロジェクトのドキュメントにその存在を明記しましょう。
- 対策: あまりにもマイナーなライブラリや、特定の1ファイルでしか使わない名前空間は
globalにせず、従来通りそのファイル内でのみusingしましょう。
3. エイリアスを活用した衝突回避
どうしてもグローバルにしたいが名前が被る、あるいは名前が長すぎるという場合は、エイリアス(別名)付きのglobal usingが有効です。
// GlobalUsings.cs
global using JSON = System.Text.Json.JsonSerializer;
これにより、プロジェクト全体で JSON.Serialize(obj) のように簡潔に記述できるようになります。

既存プロジェクトへの導入ステップ
これから既存のプロジェクトにglobal usingを導入する場合、以下の手順で進めるとスムーズです。
プロジェクトのルートディレクトリに GlobalUsings.cs ファイルを新規作成します。
多くのファイルで共通して使われている using 句を特定します。
例:System, System.Collections.Generic, System.Linq, System.Threading.Tasks や、プロジェクト独自のベース名前空間(MyApp.Core など)が対象です。
抽出した名前空間を GlobalUsings.cs 内に global using [名前空間]; という形式でまとめて記述します。
各ファイルから、グローバル化したことで不要になった重複 using 句を削除します。
Visual Studioの「不要なusingの削除」機能(ショートカット:Ctrl + R, Ctrl + G)をプロジェクト全体に対して実行すると効率的です。
まとめ
C# 10で導入されたglobal usingは、現代的なC#開発において「コードのノイズを減らし、本質的なロジックを際立たせる」ための必須テクニックと言えます。
GlobalUsings.csという専用ファイルを作成して一括管理することで、プロジェクトのメンテナンス性は飛躍的に向上します。
一方で、何でもかんでもグローバルに登録してしまうと、名前の衝突やコードの不透明化を招くリスクもあります。
「頻繁に使う標準的な名前空間」を優先的に共通化するという方針を立てて、適切に活用していきましょう。
この機能をマスターすれば、あなたのプロジェクトのソースコードは今よりもずっと美しく、読みやすいものになるはずです。
