1. ホーム
  2. c#

[解決済み] usingディレクティブはネームスペースの内側と外側のどちらを使うべきですか?

2022-03-16 03:12:24

質問

を実行しています。 スタイルコップ をC#のコードに適用したところ、私の using ディレクティブは namespace の中にあるべきものです。

を置く技術的な理由はあるのでしょうか? using ディレクティブは名前空間の外ではなく内側にあるのですか?

どのように解決するのですか?

実はこの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 を見る前に、これらの using ディレクティブを見つけることができます。 Outer.Math ではなく System.Math . 残念ながら(いや、幸いにも?) Outer.Math には PI のメンバーなので、File1が壊れました。

これは using のように、名前空間宣言の中に入れてください。

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

これでコンパイラは System を検索する前に Outer を見つけることができます。 System.Math で、万事解決です。

という意見もあるでしょう。 Math にはすでにユーザー定義クラスがあるので、ユーザー定義クラスの名前としては不適切かもしれません。 System ここで重要なのは という違いがあり、コードの保守性に影響します。

また、以下のような場合、どうなるかというのも興味深い。 Foo が名前空間 Outer よりも、むしろ Outer.Inner . その場合 Outer.Math がどこにあっても、File2 は File1 を壊します。 using になります。これは、コンパイラがどの using ディレクティブを使用します。