アプリケーションを構築していく中でたくさんのファイルを作成していきますが、それらがもし、一か所にまとまっていたら判別をするのがとても大変になりますよね。そんな時に便利なのがnamespace(名前空間)となります。
usingとは名前空間を指定することでアプリケーション内で、そのクラスなりメソッドなりが使用できるようになります。名前空間とusingを使用することで、ファイルが多いアプリケーションの実装も管理しやすくなります。
namespaceの基礎知識
まずはnamespaceから解説していきます。ここでは以降、namespaceではなく「名前空間」として登場します。これは単純に日本語読みと英語の違いなだけですので、実質同じものになります。
名前空間はファイル(クラスなど)を種類ごとに分けて管理するためにC#に搭載されている機能になります。イメージとしてはパソコン内のフォルダ分けするようなものだと考えてると簡単かなと思います。
デスクトップ
├ 写真
│ └ 2016年
├ 動画
│ ├ 2019年
│ ├ 2020年
│ └ 2021年
└ メモ
パソコンのデスクトップを上記のようにフォルダ分けしている人もいるかもしれませんね。写真や動画などは大きなまとまり・種類としてまとめておいたほうが、後から探し出すのが簡単になります。
このような感じでC#のソースコードもファイルやクラスごとにまとめて配置することができ、それらがどこに配置されているかを示すのが名前空間となります。
名前空間の使い方
名前空間で場所を指定するのは「namespace」キーワードを使用します。C#では以下のように記述することで名前空間を設定することができます。〇〇〇〇の箇所は名前空間に指定する空間の名前です。
namespace 〇〇〇〇
{
}
また名前空間は「.(ドット)」を使用することで階層構造を表現することができます。例えば先ほどのデスクトップの階層を表現するとしたらこんな感じになります。これで特定の「位置」を指定することができます。
namespace デスクトップ.写真.2016年
{
}
新規のクラスを作成します。たとえば「Classes」フォルダを作成し、その中に「Car.cs」を作成してみてください。その時のCarクラスは以下のようになっていると思います。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace App16.Classes
{
class Car
{
}
}
「namespace App16.Classes」が名前空間です。フォルダ構成をそのまま使用しているように見えますね。「App16フォルダ内のClassesフォルダ」を指していることが分かります。そのうえで「namespace」で囲まれた中にクラスが配置されています。
ですので、Carクラスのより詳細な位置は「App16.Classes.Car」となります。基本的に「名前空間.クラス名」がクラスを指し示すことになります。またプロパティやメソッドはこれまでの通りに「名前空間.クラス名.プロパティ」や「名前空間.クラス名.メソッド」となります。
このように「名前空間.クラス名.プロパティ」や名前空間からクラス、クラスの要素などをすべて列挙することを「完全修飾名」といいます。普段はあまり使うことはないかもしれませんが、知識として知っておくとよいかと思います。
usingの基礎知識
前の章ではnamespace(名前空間)について解説しました。名前空間はいわば「住所」のような役割をしています。今度は逆にその住所を使うための機能が「using」になります。
usingは「namespace」よりも前に記述することで使用可能となります。これまでのアプリケーションにおいて以下のような記述を見てきたと思います。
using System;
これは「Systemの名前空間にあるクラスや処理を使用する」という宣言に近い意味合いを持っています。ちなみにSystemにあるのは、「Console」など馴染みの深いものがあり、基本的な機能がそろっている名前空間です。
このようにして「using 〇〇」とすることで、ファイル内で使用したい名前空間を指定できるのが「using」の基本的な使い方になります。
usingの使い方
それでは実際にusingを使う方法を解説していきます。新規のアプリケーションを作成して以下のように記述してみましょう。
using System;
using Classes;
namespace App17
{
class Program
{
static void Main(string[] args)
{
Car car = new Car();
Console.ReadLine();
}
}
}
namespace Classes
{
public class Car
{
public Car()
{
Console.WriteLine("Carクラスが呼ばれました。");
}
}
}
本来は別ファイルにCarクラスを作成するのがよいのですが、分かりづらいので一つのファイルにまとめてみました。上記は初期で作成される「Program.cs」に記述している内容になります。今回、Carクラスを作成したのですがその上に「namespace」の記述があることがわかると思います。こう記述することで「CarクラスはClassesの名前空間に属している」ということになります。
一番上の行の「using Classes;」を見てみましょう。ここで先ほど指定したnamespaceが記述されているのがわかると思います。この一文で「Classesの名前空間にある機能を使用します」と明言しているんですね。
試しに「using Classes;」の部分をコメントアウトして「//using Classes;」としてみると「Car car = new Car();」のCarの箇所に赤い波線が引かれると思います。Classesの名前空間を使用する明言をコメントアウトしているので、Carクラスが見えなくなっているのです。
では別の新規のアプリケーションを作成して、以下を記述してみましょう。以下ではusingを使わずに直接Carクラスを呼び出せるようにするサンプルになります。
using System;
namespace App18
{
class Program
{
static void Main(string[] args)
{
Classes.Car car = new Classes.Car();
Console.ReadLine();
}
}
}
namespace Classes
{
public class Car
{
public Car()
{
Console.WriteLine("Carクラスが呼ばれました。");
}
}
}
先ほどと違うのは「Classes.Car car = new Classes.Car();」として「名前空間.クラス名」としているのと「using Classes;」の箇所がなくなっていることです。じつは「using Classes;」と記述しなくてもCarクラスを使用することができます。
namespace App18
{
class Program
{
static void Main(string[] args)
{
Classes.Car car = new Classes.Car();
System.Console.ReadLine();
}
}
}
namespace Classes
{
public class Car
{
public Car()
{
System.Console.WriteLine("Carクラスが呼ばれました。");
}
}
}
なんなら上記のように、まったくusingを使用しなくてもコードを記述することができます。ただし、毎回、機能を呼び出すたびに完全修飾名を記述する必要があるので、かなり面倒になりますよね。そうしたときにusingは便利だなと感じます。
名前空間とusingを覚えよう
以上、名前空間とusingについて解説してきました。実際にソースコードも交えて解説してきたので、かなり理解していただけたのではないかと思います。
usingや名前空間は現場の案件でも必須知識となりますので、しっかりと覚えておく必要があります。「どこどこのファイルがどこどこの名前空間にある」とかは日常的な会話になりますし、実装する時に必要な機能を使うときにusingを使用することになります。
複雑なアプリケーションで難しく感じるよりも、まずは上記のようなサンプルで簡単に考えてみれば分かりやすいはずです。しっかりと復習して、名前空間とusingはマスターしておきましょう。