C# では、「using」ディレクティブは名前空間の内側に置くべきか外側に置くべきか? 質問する

C# では、「using」ディレクティブは名前空間の内側に置くべきか外側に置くべきか? 質問する

私は走ってきましたスタイルコップいくつかの C# コードで、usingディレクティブは名前空間内にある必要があると報告され続けます。

usingディレクティブを名前空間の外部ではなく内部に配置する技術的な理由はありますか?

ベストアンサー1

実際には、この 2 つには (微妙な) 違いがあります。File1.cs に次のコードがあるとします。

// File1.cs
using System;
namespace Outer.Inner
{
    class Foo
    {
        static void Bar()
        {
            double d = Math.PI;
        }
    }
}

ここで、誰かが次のような別のファイル (File2.cs) をプロジェクトに追加したと想像してください。

// File2.cs
namespace Outer
{
    class Math
    {
    }
}

コンパイラは、名前空間外のディレクティブOuterを調べる前に検索するため、の代わりにを見つけます。残念ながら (あるいは幸運なことに?)にはメンバーがないため、File1 は壊れてしまいます。usingOuter.MathSystem.MathOuter.MathPI

using次のように名前空間宣言内に配置すると、状況は変わります。

// File1b.cs
namespace Outer.Inner
{
    using System;
    class Foo
    {
        static void Bar()
        {
            double d = Math.PI;
        }
    }
}

これで、コンパイラは をSystem検索する前にを検索しOuter、 を見つけてSystem.Math、すべてが正常になります。

Mathにはすでに が存在するため、ユーザー定義クラスにこの名前を使用するのは適切ではないと主張する人もいますSystem。ここでのポイントは、違いが存在するということ、それがコードの保守性に影響するということです。

が ではなくFoo名前空間 にある場合に何が起こるかに注目するのも興味深いことです。その場合、がどこにあるかに関係なく、 File2 を追加すると File1 が壊れます。これは、コンパイラがディレクティブを調べる前に、最も内側の囲み名前空間を検索することを意味しますOuterOuter.InnerOuter.Mathusingusing

おすすめ記事