2022年01月30日
川俣晶の縁側ソフトウェアnew_C#入門・全キーワード明快解説! total 883 count

namespaceキーワードとusingディレクティブ: 名前空間は名前の衝突を解決する

Written By: 川俣 晶連絡先

この章のテーマ §

 namespaceキーワードとusingディレクティブについて学びます。usingディレクティブはusingステートメントとは違うものなので注意して下さい。

前提知識 §

Console.WriteLineメソッド, 文字列の基礎, 変数の基礎, クラスの基礎, メソッドの基礎

解説 §

 クラスのメンバーの名前が衝突したときは、オーバーロードなどの方法で解決できる場合があります。しかし、クラス名そのものが衝突したときには対処できません。このような場合は名前空間という技術を使うことで、同じクラス名を複数使うことができます。

 これは、たまたま利用した複数のクラスライブラリで同じ名前を使っていた、といった問題を解決するのに便利です。

 名前空間を利用する場合、namespaceキーワードで特定の名前が付いた名前空間を定義できます。この名前空間に属するクラスなどは、"名前空間名.型名"という書式で名前を記述でき、同じ名前で名前空間が違えば識別できます。

 これだけは不便なので、usingディレクティブが存在します。usingディレクティブは、特定の名前空間を利用することを宣言し、その名前空間名を書くことを省略できます。

 たとえば、多くのサンプルソースでConsoleクラスを使っていますが、これのフルネームはSystem.Consoleです。Systemという名前空間に属しています。しかし、usingディレクティブがあるので、"System."は省略できます。「そんなusingディレクティブ見たことないぞ」という人も多いと思いますが、それもそのはず、それは共通のSDKに含まれるglobal usingの定義にあるからです。これを使うかどうかはプロジェクトのプロパティで設定できます。デフォルトでは使用するように設定されています。

罠の数々 §

  • たとえば、PathクラスはSystem.IO.PathクラスとSystem.Windows.Shapes.Pathクラスなど、名前がかぶりやすい。しかし、名前がかぶってもフルネームを名前空間から書けば安全に識別できる
  • フルネームを書くか先頭にusingディレクティブを書くかは微妙な時がある。どちらでも動作は同じだから悩みすぎるな
  • 名前空間の付け方に特別厳格なルールはない。しかし、みんなが使うライブラリを書くなら、他人のライブラリとかぶらないような名前を工夫すると良い。SystemやMicrosoftや他社名から始まる名前空間名は使うべきではない

参考リンク §

namespace

using ディレクティブ

型を整理する名前空間を宣言する

サンプルソース: kw_namespace §

using NamespaceBeta;

var x = new NamespaceAlpha.MySample();

x.Sub();

var y = new MySample();

y.Sub();

namespace NamespaceAlpha

{

    public class MySample

    {

        public void Sub()

        {

            Console.WriteLine("I'm NamespaceAlpha.MySample.Sub()");

        }

    }

}

namespace NamespaceBeta

{

    public class MySample

    {

        public void Sub()

        {

            Console.WriteLine("I'm NamespaceBeta.MySample.Sub()");

        }

    }

}

実行結果 §

I'm NamespaceAlpha.MySample.Sub()

I'm NamespaceBeta.MySample.Sub()

リポジトリ §

https://github.com/autumn009/CSharpPrimer2

練習問題 §

 ソースコード中に以下のようなソースファイルを発見した。ここには1つのクラスが記述されている。このクラスのフルネーム(GetType().FullNameで取得できる名前)は何だろうか。

namespace MyNamespace;

public class MyClass

{

    public void Sub()

    {

        Console.WriteLine("Hello!");

    }

}

  1. MyNamespace
  2. MyClass
  3. Sub
  4. MyNamespace.MyClass
  5. Hello!

[[解答]]

単行本情報