C#の名前空間:命名競合を防ぐ仕組みと使い方
名前空間(namespace)は、1つの名前のセットを別の名前のセットから分離する方法を提供するために設計されています。ある名前空間で宣言されたクラス名は、別の名前空間で宣言された同じクラス名と競合しません。
名前空間の定義
名前空間の定義は、キーワードnamespaceに続けて名前空間名を指定します。
namespace namespace_name {
// コード宣言
}
名前空間で修飾された関数や変数を呼び出すには、名前空間名を前置します。
namespace_name.item_name;
名前空間の使用例
using System;
namespace FirstSpace {
class NamespaceClass {
public void Func() {
Console.WriteLine("Inside FirstSpace");
}
}
}
namespace SecondSpace {
class NamespaceClass {
public void Func() {
Console.WriteLine("Inside SecondSpace");
}
}
}
class TestClass {
static void Main(string[] args) {
FirstSpace.NamespaceClass fc = new FirstSpace.NamespaceClass();
SecondSpace.NamespaceClass sc = new SecondSpace.NamespaceClass();
fc.Func(); // "Inside FirstSpace"
sc.Func(); // "Inside SecondSpace"
Console.ReadKey();
}
}
実行結果:
Inside FirstSpace
Inside SecondSpace
usingキーワード
usingキーワードは、プログラムが指定された名前空間の名前を使用することを宣言します。例えば、プログラムでSystem名前空間を使用しています。Consoleクラスはそこに定義されています。私たちは単に以下のように書けます。
Console.WriteLine("Hello there");
完全修飾名で書くこともできます。
System.Console.WriteLine("Hello there");
usingディレクティブによる名前空間のインポート
using名前空間ディレクティブを使用すると、以降のコードで指定された名前空間の名前を使用することをコンパイラに伝えます。名前空間はその後のコードで暗黙的に適用されます。
using System;
using FirstSpace;
using SecondSpace;
namespace FirstSpace {
class Abc {
public void Func() {
Console.WriteLine("Inside FirstSpace");
}
}
}
namespace SecondSpace {
class Efg {
public void Func() {
Console.WriteLine("Inside SecondSpace");
}
}
}
class TestClass {
static void Main(string[] args) {
Abc fc = new Abc(); // FirstSpace.Abc
Efg sc = new Efg(); // SecondSpace.Efg
fc.Func();
sc.Func();
Console.ReadKey();
}
}
usingの高度な用法
エイリアス(別名)の定義
名前が競合する場合や長い名前を短くしたい場合に使用します。
using ProjectA = MyCompany.ProjectA;
using ProjectB = MyCompany.ProjectB;
// 使用
ProjectA.ClassName obj1 = new ProjectA.ClassName();
ProjectB.ClassName obj2 = new ProjectB.ClassName();
using static(C# 6.0以降)
静的メンバーをクラス名なしで呼び出せるようになります。
using static System.Console;
using static System.Math;
class Program {
static void Main() {
WriteLine("Hello"); // Console.WriteLine
WriteLine(Sqrt(16)); // Math.Sqrt
WriteLine(PI); // Math.PI
}
}
ネストした名前空間
名前空間を別の名前空間内に定義できます。
namespace Namespace1 {
// コード宣言
namespace Namespace2 {
// コード宣言
}
}
ネストした名前空間のメンバーにはドット(.)演算子でアクセスします。
using System;
using FirstSpace;
using FirstSpace.SecondSpace;
namespace FirstSpace {
class Abc {
public void Func() {
Console.WriteLine("Inside FirstSpace");
}
}
namespace SecondSpace {
class Efg {
public void Func() {
Console.WriteLine("Inside SecondSpace");
}
}
}
}
class TestClass {
static void Main(string[] args) {
Abc fc = new Abc();
Efg sc = new Efg();
fc.Func();
sc.Func();
Console.ReadKey();
}
}
グローバル名前空間
global::プレフィックスを使用すると、グローバル名前空間(ルート)からの完全修飾名で参照できます。名前空間名がクラス名と競合する場合などに有用です。
global::System.Console.WriteLine("Global namespace");
ファイルスコープの名前空間(C# 10.0以降)
ファイル全体が1つの名前空間に属する場合、波括弧を省略して1行で宣言できます。
namespace MyProject.Models;
public class User { ... }
public class Order { ... }
命名規則とベストプラクティス
| レベル | パターン | 例 |
|---|---|---|
| ルート | CompanyName | MyCompany |
| 製品/プロジェクト | CompanyName.ProductName | MyCompany.ECommerce |
| 機能/レイヤー | CompanyName.ProductName.Feature | MyCompany.ECommerce.Orders |
| サブ機能 | ... | MyCompany.ECommerce.Orders.Repositories |
- パスカルケース(
MyNamespace)を使用 - ディレクトリ構造と名前空間を一致させる
- トップレベルの名前空間には会社名や組織名を使用してグローバルな一意性を確保
- 同一プロジェクト内で同名のクラスを異なる名前空間に定義しない(混乱の元)
usingディレクティブはファイル先頭にまとめ、未使用のものは削除する- 循環参照にならないよう名前空間間の依存関係を設計する
よくある問題と対処
- 型名の競合:完全修飾名またはエイリアス(
using Alias = Namespace.Type;)で解決 - 意図しない型が参照される:
usingの順序やエイリアスで明示的に制御 - 内部実装の公開:
internalアクセス修飾子と名前空間を組み合わせてアセンブリ内公開に限定
C言語
- C# Hello World – 初めてのC#アプリケーション構築
- C# キーワードと識別子:ルール、一覧、ベストプラクティス完全ガイド
- C# 変数とプリミティブデータ型:完全マスターガイド
- C#演算子完全ガイド:C#における演算子の包括的解説
- C# ビット演算子とビットシフト演算子をマスターする:包括的ガイド
- C# 入出力の基礎:ユーザー入力と出力の基本をマスター
- C# の式、文、ブロック:実践例で徹底理解
- C# コメントをマスターする:種類、ベストプラクティス、XML ドキュメント
- C# switch 文をマスターする:構文、例、ベストプラクティス
- C# 三項演算子:条件式を簡潔に書くためのガイド
- C# break 文:使い方とタイミングを徹底解説