ITコンサルの日常

ITコンサル会社に勤務する普通のITエンジニアの日常です。

インデント深い(名前空間の話)

プログラミングC#中のサンプルプログラムは、ひたすらnamespace宣言が付いている。
これが恐らく一般的なのだろうが、namespaceだけで1インデント行かれると、さらにclass、Mainでそれぞれ1インデントずつ下がるため、プログラムの中身は4段目から始まることになる。
はっきり言ってうざい。
で、namespace取ったらどうなるの?ってやってみた。

using System;

class test
{
                static void Main()
                {
                                Console.WriteLine("aaa");
                }
}

結果はこう。

>csc test.cs
Microsoft (R) Visual C# 2008 Compiler version 3.5.21022.8
for Microsoft (R) .NET Framework version 3.5
Copyright (C) Microsoft Corporation. All rights reserved.


>test
aaa

>

なんの問題もなく動いた。サンプル書いてる限りでは、namespaceいらなそう。


じゃあなんでこんな構文にしたのだろうと考えてみる。
Javaではpackage文でnamespaceを宣言する。これは一つのファイルに一つしか書けない。(一つのファイルは二つのディレクトリに置けないので。ただし、そうとも限らない*1らしい。)
ってことは、C#では一つのファイルに二つ以上の名前空間を含められるのか?と思い、こんなサンプルを書いてみた。

using System;

namespace ns1
{
        class nstest
        {
                static void Main()
                {
                        ns2.Hello.hello();
                }
        }
}

namespace ns2
{
        class Hello
        {
                public static void hello()
                {
                        Console.WriteLine("ns2.Hello.hello");
                }
        }
}

この結果はこう。

ns2.Hello.hello

というわけで、C#では一つのファイルに二つ以上の名前空間を含められるので、そのためにこういう構文になっているのだと思います。たぶん。

*1:Java言語規定の「7.2 パッケージのホスト支援」によると、パッケージ名とディレクトリ階層を紐付けるのは、一つの実装方法に過ぎないと読めるので。