2013-07-23 11 views
12

C#で "namespace"ディレクティブを使用できる理由がわかりました。though in C++ it is not。私はC++とC#が異なっていることを認識していますが、私の推測はC++であり、C#はほとんど同じファミリから来ており、名前空間の解決にも同じ考え方を使用する必要があります。 C++とC#の両方には、名前空間の衝突を回避するためのエイリアスキーワードがあります。C#で "using namespace"ディレクティブがコーディング慣習として受け入れられるのはなぜですか?

誰でも私がC#の行の間で読んでいないことを指摘して、 "using namespace"ディレクティブを使用しても問題ないようにすることができます。

+0

C#で 'namespace'ステートメントを単に使用するのではなく、名前空間の衝突を避けるためにネームスペース(別名 'System'やそれ以外のもの以外)のエイリアシングを好むでしょう! –

+0

彼らは100%異なっているかもしれませんが、質問はまだ有効です。どのように名前空間のメソッド/クラスを公開するのがC#では大丈夫ですが、C++ではどうですか? –

+0

@DanielFigueroa:C#で何が行われたのか誤解されていますが、実際にはかなり似ています。私の悪い。 –

答えて

27

C++では、ヘッダにusing namespaceを書き込むと、そのヘッダを含むすべての人に有効になります。これにより、ヘッダーではほとんど使用できなくなります。その点では、一貫性のために.cppファイル内で(グローバルスコープで)回避することもできますし、.hと.cppの間の実装を簡単にすることもできます。

(ローカルusing namespaceスコープノート - 関数内でIEが - 一般的に罰金と考えられている。それは、彼らは非常に冗長性を支援していないということだけだ)のC#で

は、#includeのようなもの、との範囲はありませんusingディレクティブは、単一の.csファイルを越えることはありません。だからどこでも使えるのはかなり安全です。

その他の理由は、標準ライブラリの設計です。 C++では、ちょうどstdを持っています(これはもう少し下にありますが、ほとんど使用されていません)。 C#では、あなたは非常に一般的に使用されている何かのために非常に冗長であるSystem.Collections.Genericのような宝石を持っています。 C#ではC++よりもusingを避けるほうがずっと面倒です。

C#とC++は共通のデザインを共有していますが、コードモジュラリティ(ヘッダー、モジュール、名前空間をすべてそのグループに割り当てています)ではデザインが非常に異なります。

+1

そうです。 C++にヘッダーを含めることは、シンボリックインクルードではなく、テキストインクルードです。 –

5

私の場合は、サポートツールになります。 Intellisense、クイッククラスルックアップ(F1キー)、およびVisual Studioのリファクタリングオプションは、必要な参照ルックアップ機能を提供します。

また、C#にはクラス内にすべてのメソッドがあります。名前空間レベルの関数はありません。

+2

プラス1名前空間レベルの関数についてのあなたのコメント - 私はこれは、なぜC++での '名前空間の使用'に惑わされたのかの大きな部分であると思います。 –

3

一般に、C#とC++の違いは、コンパイル単位がどのように処理され指定されるかです。

C++はヘッダファイルを使用してクラス宣言を発行し、このクラスが実装(定義)されているコンパイルユニットが必要です。ヘッダーファイル内のusing namespace <xxx>ステートメントは、一部のクライアントコードからインクルードされたときにネームスペースの衝突やあいまいさが発生しやすいため、C++の使用を強くお勧めします。あなたのクラス宣言では、他の名前空間から望むものを明示的に述べるべきです(stdを含む)。

C#には、using namespace <xxx>ステートメントの使用を容易にする単一のコンパイル単位があります。それでも、退屈な入力を避けたい場合は、インポートされた名前空間のエイリアシングを好むでしょう。 usingステートメントを.csファイルに配置すると、あいまいな定義も発生する可能性があります。

0

言語を純粋にしていない限り、時間を節約してコーディングを容易にします。ネームスペースの複雑なシステムを扱っていない限り、それは完全に受け入れられます。

1

名前空間をヘッダーで使うべきではないと私は完全に同意しますが、私はcppファイルでそれらを禁止するのは近視眼的だと思います。宣言を整理して「きれいに」名前空間に入れようとするが、「名前空間を使う」の使用を禁止すると、コーダの抵抗が最も少ないパスが名前空間の使用下になる。

例えば、上記のPavel Minaevの記事では、共通のC++名前空間「std」とC#名前空間「System.Collections.Generic」との間の名前空間の違いを正当に指摘しています。 なぜ彼らは彼らがこのように考える理由を停止した場合、明確な答えは、C + +文化はネームスペースを使用して眉をひそめているので、C#では使用するのが本質的に痛いので、より詳細な名前空間を受け入れます。私は、C#のネームスペースの組織がC++よりはるかに優れていると考えています。これは主にこの文化の違いであり、クラス構成と一般的な可読性の向上はささいなことではありません。

別の言い方をすれば、アプリケーションがファイルをロードするための完全修飾パスを入力する必要がある場合、人のファイル編成の習慣がどうなるか考えてみてください。彼らは、入力を避けるためにすべてをルートフォルダに押し込んでしまう可能性が高いですが、質の高い組織を促進する良い方法ではありません。

C#のディレクティブを使用するときれいにはなりませんが、cppファイルの名前空間を使用することは全体的な勝利です。