Visual Studioで学ぶC#の名前空間:同じLocationクラスを使い分ける

広告

C#では、同じ名前のクラスでも、所属する名前空間が異なれば別のクラスとして定義できます。今回はVisual Studioで、用途の異なる2つのLocationクラスを作成し、名前空間の役割を確認します。

今回の学習目標

  • クラスを名前空間の中に定義できる
  • 同名クラスを名前空間で区別できる
  • 完全修飾名とusingエイリアスの使い方を理解する

作成するクラスは、緯度・経度を表すMyApp.Map.Locationと、画面上のX・Y座標を表すMyApp.Drawing.Locationです。

同じLocationクラスをMyApp.MapとMyApp.Drawingの名前空間で区別する図
同じLocationというクラス名でも、所属する名前空間が違えば区別できます。

完成時のファイル構成

1  MyApp
2  ├─ Drawing
3  │  └─ Location.cs
4  ├─ Map
5  │  └─ Location.cs
6  └─ Program.cs
Visual Studioのソリューション エクスプローラー。DrawingとMapの各フォルダーにLocation.csを配置した構成
Visual Studioのソリューション エクスプローラー。DrawingとMapの各フォルダーに、同名のLocation.csを配置しています。

1.コンソールアプリを作成する

  1. Visual Studioを起動します。
  2. 「新しいプロジェクトの作成」を選択します。
  3. 「コンソール アプリ(.NET Framework)」を選択します。
  4. プロジェクト名をMyAppにします。
  5. 「作成」をクリックします。

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.LocationDrawing.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.LocationMyApp.Drawing.Locationのどちらを使うのか判断できず、Locationが曖昧であることを示すエラーになります。

曖昧なLocationクラスを完全修飾名とusingエイリアスで解決する図
同名クラスの曖昧さは、完全修飾名またはusingエイリアスで解決できます。

完全修飾名で区別する

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エイリアスで区別できる
  • フォルダーと名前空間を対応させると、プロジェクトが分かりやすくなる

練習問題

  1. 別の地図上の位置を作成し、緯度と経度を表示してください。
  2. 別の描画位置を作成し、X座標とY座標を表示してください。
  3. 2つのLocationクラスをusingエイリアスで指定してください。
訪問数 3 回, 今日の訪問数 3回

広告