グローバル using とは
C# 10 から導入された global using 機能は、プロジェクト内で繰り返し記述される using 宣言の冗長性を解消するための仕組みです。特定のファイルで global キーワード付きで宣言された名前空間は、プロジェクト全体のすべてのソースファイルから自動的に利用可能になります。
これにより、共通のライブラリやユーティリティクラスへの参照を一元管理でき、コードの簡潔さと保守性が向上します。
主な適用ケース
- 頻出する基底名前空間:例:
System,System.Collections.Generic - 共通ユーティリティや拡張メソッド を提供するカスタム名前空間
- 大規模プロジェクトでの依存の一元管理 — 特定のファイル(例:
SharedUsings.cs)に集約 - 複数プロジェクト間での整合性維持
構文と基本的な使用法
従来のファイルスコープの using に対して、global を付加することでプロジェクト全体に適用されます。
従来の方式(ファイルごとに必要)
using System;
using System.IO;
namespace MyApp.Services
{
public class FileService
{
public void Log(string message)
{
Console.WriteLine(message); // OK
}
}
}
グローバル using の定義
// SharedUsings.cs
global using System;
global using System.Threading.Tasks;
global using Microsoft.Extensions.DependencyInjection;
// 別ファイル
namespace MyApp.Processing
{
public class DataProcessor
{
public async Task Process()
{
await Task.Delay(100);
Console.WriteLine("処理完了"); // using 不要
}
}
}
高度な使用パターン
静的メンバのグローバルインポート
よく使う静的クラスのメソッドを省略可能にします。
global using static System.Console;
global using static System.Math;
// 使用側
WriteLine(Sqrt(144)); // Math.Sqrt, Console.WriteLine が暗黙可用
注意点: 可読性の低下を招く可能性があるため、数学演算やログ出力など局所的な用途に限定すると良いでしょう。
型別名のグローバル定義
頻繁に使う複雑な型に短縮名を付けることができます。
global using Json = System.Text.Json.JsonSerializer;
global using IntList = System.Collections.Generic.List<int>;
// 使用例
var numbers = new IntList { 1, 2, 3 };
string json = Json.Serialize(numbers);
警告: List のような一般的な名前を使用すると、他の開発者を混乱させる恐れがあります。意図を明確にする命名が推奨されます。
条件付きグローバル using
ターゲットフレームワークに応じて異なるライブラリをインポートできます。
#if NET7_0_OR_GREATER
global using System.Net.Http.Json;
#else
global using Newtonsoft.Json;
#endif
この手法により、.NET バージョンの違いに対応したレガシー互換コードの記述が容易になります。
暗黙のグローバル using(.NET 6+)
.NET 6 以降のプロジェクトでは、SDK が自動的に一部の共通名前空間をグローバル登録します。これを有効化するには、プロジェクトファイルに以下を追加します。
<PropertyGroup>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
これにより、System, System.Linq などが自動でグローバル using され、多くの場合明示的な宣言が不要になります。
設計上の考慮点とベストプラクティス
- スコープの優先順位: ファイル内での通常の
usingは、グローバル宣言よりも優先されます。 - コンパイル順序: グローバル using は、型定義より前に記述する必要があります。
- 名前の衝突: 複数の global using で同じ型名が見える状態になると、曖昧性エラーが発生します。
- 過度な使用の回避: 全ての using をグローバル化すると、各ファイルの実際の依存関係が見えにくくなり、保守性が低下します。
特にチーム開発では、どの名前空間がグローバルに公開されているかをドキュメント化 したり、専用の GlobalUsings.cs ファイルを設けて可視性を高めることが望ましいです。