[解決済み] usingディレクティブはネームスペースの内側と外側のどちらを使うべきですか?
質問
を実行しています。
スタイルコップ
を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
ディレクティブを使用します。
関連
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] 複数の例外を一度にキャッチする?
-
[解決済み] IDisposable インターフェースの正しい使用法
-
[解決済み] C#がforeachで変数を再利用するのは理由があるのか?
-
[解決済み] Try-catchは私のコードをスピードアップさせるか?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] async」と「await」の使い方とタイミング
-
[解決済み] UTF-8 byte[]を文字列に変換する方法
-
[解決済み] .NET Coreと.NET Standard Class Libraryのプロジェクトタイプの違いは何ですか?
-
[解決済み】大文字・小文字を区別しない「Contains(string)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】"出力タイプがクラスライブラリのプロジェクトは直接起動できない"
-
解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C# [解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C#.
-
[解決済み】C# ASP.NET使用時に「WebClientのリクエスト中に例外が発生しました。
-
[解決済み】Sequence contains no matching element(シーケンスにマッチする要素がない
-
[解決済み】バックスラッシュを含むパス文字列のエスケープシーケンスが認識されない件
-
[解決済み】非静的メソッドはターゲットを必要とする
-
[解決済み】IntPtrとは一体何なのか?
-
[解決済み】Unityでゲームオブジェクトのすべての子をループスルーして破壊する方法?
-
[解決済み】ファイルやアセンブリ、またはその依存関係の1つをロードできませんでした。
-
[解決済み】名前 'ViewBag' が現在のコンテキストに存在しない - Visual Studio 2015