Visual Studioで学ぶC#の名前空間:同じLocationクラスを使い分ける
C#では、同じ名前のクラスでも、所属する名前空間が異なれば別のクラスとして定義できます。今回はVisual Studioで、用途の異なる2つのLocationクラスを作成し、名前空間の役割を確認します。
今回の学習目標
- クラスを名前空間の中に定義できる
- 同名クラスを名前空間で区別できる
- 完全修飾名とusingエイリアスの使い方を理解する
作成するクラスは、緯度・経度を表すMyApp.Map.Locationと、画面上のX・Y座標を表すMyApp.Drawing.Locationです。

完成時のファイル構成
1 MyApp
2 ├─ Drawing
3 │ └─ Location.cs
4 ├─ Map
5 │ └─ Location.cs
6 └─ Program.cs

1.コンソールアプリを作成する
- Visual Studioを起動します。
- 「新しいプロジェクトの作成」を選択します。
- 「コンソール アプリ(.NET Framework)」を選択します。
- プロジェクト名を
MyAppにします。 - 「作成」をクリックします。
2.Map名前空間のLocationクラスを作成する
ソリューション エクスプローラーでMyAppプロジェクトを右クリックし、「追加」→「新しいフォルダー」を選択します。フォルダー名をMapにしてください。続いてMapフォルダーにLocation.csを追加し、次のコードを入力します。
1 // ■リスト9-1:名前空間の中にクラスを定義する(1)
2 namespace MyApp.Map
3 {
4 class Location // Locationクラスは、名前空間MyApp.Mapに属している
5 {
6 public double Latitude { get; set; } // 緯度
7 public double Longitude { get; set; } // 経度
8 }
9 }
このクラスは、地図上の位置を緯度と経度で表します。完全なクラス名はMyApp.Map.Locationです。
3.Drawing名前空間のLocationクラスを作成する
MyAppプロジェクトにDrawingフォルダーを作成します。その中にもう一つのLocation.csを追加し、次のコードを入力します。
1 // ■リスト9-2:名前空間の中にクラスを定義する(2)
2 namespace MyApp.Drawing
3 {
4 class Location // Locationクラスは、名前空間MyApp.Drawingに属している
5 {
6 public int X { get; set; } // X座標
7 public int Y { get; set; } // Y座標
8 }
9 }
こちらは画面や図形上の位置をX座標とY座標で表します。完全なクラス名はMyApp.Drawing.Locationです。
4.Program.csから2つのクラスを使用する
1 using System;
2
3 namespace MyApp
4 {
5 class Program
6 {
7 static void Main(string[] args)
8 {
9 var mapLocation = new Map.Location
10 {
11 Latitude = 35.6812,
12 Longitude = 139.7671
13 };
14
15 var drawingLocation = new Drawing.Location
16 {
17 X = 100,
18 Y = 200
19 };
20
21 Console.WriteLine("地図上の位置");
22 Console.WriteLine($"緯度:{mapLocation.Latitude}");
23 Console.WriteLine($"経度:{mapLocation.Longitude}");
24 Console.WriteLine();
25 Console.WriteLine("描画上の位置");
26 Console.WriteLine($"X座標:{drawingLocation.X}");
27 Console.WriteLine($"Y座標:{drawingLocation.Y}");
28 }
29 }
30 }
ProgramクラスはMyApp名前空間に属しているため、内側の名前空間をMap.Location、Drawing.Locationのように指定できます。
5.実行結果を確認する
「開始」ボタン、またはCtrl + F5で実行します。
1 地図上の位置
2 緯度:35.6812
3 経度:139.7671
4
5 描画上の位置
6 X座標:100
7 Y座標:200
同じクラス名を直接使うとどうなるか
1 using MyApp.Map;
2 using MyApp.Drawing;
3
4 var location = new Location();
この場合、コンパイラーはMyApp.Map.LocationとMyApp.Drawing.Locationのどちらを使うのか判断できず、Locationが曖昧であることを示すエラーになります。

完全修飾名で区別する
1 var mapLocation = new MyApp.Map.Location();
2 var drawingLocation = new MyApp.Drawing.Location();
名前空間からすべて記述した名前を「完全修飾名」と呼びます。
usingエイリアスで区別する
1 using System;
2 using MapLocation = MyApp.Map.Location;
3 using DrawingLocation = MyApp.Drawing.Location;
4
5 namespace MyApp
6 {
7 class Program
8 {
9 static void Main(string[] args)
10 {
11 var mapLocation = new MapLocation
12 {
13 Latitude = 35.6812,
14 Longitude = 139.7671
15 };
16
17 var drawingLocation = new DrawingLocation
18 {
19 X = 100,
20 Y = 200
21 };
22
23 Console.WriteLine(
24 $"緯度:{mapLocation.Latitude}、経度:{mapLocation.Longitude}");
25 Console.WriteLine(
26 $"X座標:{drawingLocation.X}、Y座標:{drawingLocation.Y}");
27 }
28 }
29 }
フォルダーと名前空間の関係
フォルダーと名前空間は別の仕組みです。実際の名前空間は、コード内のnamespaceで指定します。ただし、対応させると管理しやすくなります。
1 Mapフォルダー → namespace MyApp.Map
2 Drawingフォルダー → namespace MyApp.Drawing
まとめ
- 名前空間を使うと、クラスを用途ごとに分類できる
- 同じ名前のクラスでも、名前空間が違えば別のクラスとして扱える
- 同名クラスは完全修飾名やusingエイリアスで区別できる
- フォルダーと名前空間を対応させると、プロジェクトが分かりやすくなる
練習問題
- 別の地図上の位置を作成し、緯度と経度を表示してください。
- 別の描画位置を作成し、X座標とY座標を表示してください。
- 2つの
Locationクラスをusingエイリアスで指定してください。








ディスカッション
コメント一覧
まだ、コメントがありません