なぜ「システムを使用」しているのですか。悪い習慣とは見なされません?

私にはC ++の背景があり、この質問への回答を完全に理解して同意します。なぜ「名前空間stdを使用するのか」。悪い習慣と考えた?

だから、今C#の経験があるのに、正反対のことが見えることに驚いています。 「Some.Namespace;を使用する」は文字通りどこでも使用されます。 タイプを使い始めるときはいつでも、その名前空間に使用ディレクティブを最初に追加します(まだ存在しない場合)。 「システムの使用」で始まっていない「.cs」ファイルを見たことを思い出せません。 System.Collections.Genericを使用します。 X.Y.Z;の使用等...`。 実際、Visual Studioウィザードを介して新しいファイルを追加すると、まったく必要ない場合でも、そこにいくつかの使用ディレクティブが自動的に追加されます。 したがって、C ++コミュニティでは基本的にリンチされますが、C#はこれを行うことさえ奨励します。 少なくともこれは私にそれがどのように見えるかです。

現在、C#とC ++のディレクティブを使用することはまったく同じではないことを理解しています。 また、C ++で「名前空間を使用する」ことでできる最も厄介なことの1つ、つまりヘッダーファイルに入れると、ヘッダーファイルの概念がないため、C#に同等に厄介な対応物がないことがわかります。 #include

ただし、それらの違いにもかかわらず、C#とC ++のディレクティブを使用することは同じ目的を果たします。これは、はるかに長い Some.Namespace.SomeType(C ++で ::の代わりに。`)。 これと同じ目的で、危険も私には同じであるように見えます:衝突に名前を付けます。

最良の場合、これはコンパイルエラーになるため、「修正」するだけで済みます。 最悪の場合でも、コンパイルされ、コードは意図したものとは異なることを静かに実行します。 だから私の質問は次のとおりです。なぜ(どうやら)C#とC ++でそれほど不平等に悪いと考えられるディレクティブを使用しているのですか?

私が持っている答えのいくつかのアイデア(ただし、これらのどれも本当に私を満足させません):

-名前空間は、C ++よりもC#の方がはるかに長く、はるかに多くネストされる傾向があります( std vs. System.Collection.Generic)。 したがって、この方法でコードをノイズ除去することには、より多くの欲求とより多くの利益があります。 しかし、これが真実であっても、この議論は標準の名前空間を見るときにのみ適用されます。 カスタム名には、C#とC ++の両方で、好きな短い名前を付けることができます。

-名前空間は、C ++よりもC#の方がはるかに「細かい粒状」であるように見えます。 例として、C ++では、標準ライブラリ全体が std(および chronoのようないくつかの小さなネストされた名前空間)に含まれていますが、C#には System.IOSystem.ThreadingSystem.Textがあります。等. したがって、命名衝突のリスクは小さくなります。 しかし、これは直感にすぎません。 「名前空間stdを使用」と「システムを使用」を使用して「インポート」する名前の数は実際には数えませんでした。 繰り返しになりますが、これが真実であっても、この議論は標準の名前空間を見るときにのみ適用されます。 独自のものは、C#とC ++の両方で、好きなように細かい粒状に設計できます。

もっと議論がありますか? 私は特に実際の難しい事実(ある場合)に興味があり、あまり意見には興味がありません。

質問へのコメント (31)
ソリューション

なぜ「システムを使用」しているのですか。悪い習慣とは見なされません?

"システムを使用;" not は、一般的に悪い習慣とは見なされていません。 例を参照してください:C#で「使用」ディレクティブを使用しないのはなぜですか?

しかし、「名前空間stdを使用する」ほど悪いとは見なされないのは本当かもしれません。 おそらく:

1。 C#にはヘッダーファイルがありません。 プリプロセッサを使用して1つのC#ソースファイルを別のファイルに「含める」ことは珍しいです。

2。 std名前空間はほぼフラットです。 ほとんどすべての標準ライブラリ関数、タイプ、および変数が含まれています(ファイルシステムのサブ名前空間などの例外はほとんどありません)。 非常に多数の識別子が含まれています。 私の理解では、「システム」にははるかに少ない名前が含まれ、代わりにより多くのサブ名前空間があります。

3。 C#には、グローバル関数や変数はありません。 そのため、グローバル識別子の数は、C ++とは対照的に、通常は非常に少なく、次のものが含まれます。さらに、名前空間を持たないCライブラリ(多くの場合、間接的に)を使用するのが一般的です。グローバル名前空間。

4。 私の知る限り、C#には引数依存ルックアップはありません。 名前の非表示、オーバーロードなどと組み合わせたADL. 一部のプログラムが名前の競合の影響を受けないケースを生成する可能性がありますが、他のプログラムは微妙に影響を受け、すべてのコーナーケースをキャッチすることはテストでは実行できません。

これらの違いのため、「システムを使用する」。 「名前空間stdを使用する」よりも、名前の競合の可能性が低くなります。

---。

また、名前空間「インポート」は、ある意味で、自己永続的な規則です。標準の名前空間をインポートすることが従来型である場合、プログラマーは従来、独自の識別子にその名前空間から名前を選択しないように試行します。このような慣習の問題。

そのようなインポートが悪い習慣であると考えられる場合、プログラマーはインポートされた名前空間との競合のそのような回避を試みることさえ少なくなります。 そのため、選択間の引数の重みが最初に微妙であったとしても、慣習は慣習の賛成または反対のどちらかで二極化する傾向があります。

解説 (6)

ただし、違いにもかかわらず、C#とC ++のディレクティブを使用することは同じ目的を果たします。これは、Some.Namespace.SomeTypeをより長くするのではなく、常にSomeTypeを入力する必要があるだけです(C ++では::ではなく)。 .)。 これと同じ目的で、危険も私には思えます:衝突に名前を付けることです。

はい、しかしあなたはその危険を_エクスポート_しませんでした(読む:他の人にそれに対処することを強制する)。

現在、C#とC ++のディレクティブを使用することはまったく同じではないことを理解しています。 また、C ++で名前空間を使用して実行できる最も厄介なことの1つ、つまりヘッダーファイルに配置することは、ヘッダーファイルと#includeの概念がないため、C#に相当するものがないことも理解しています。

したがって、それは物事の異なるカテゴリーです。

また、C ++は、C#と同じようにIDEで開発されるように「設計」されていません。 C#は基本的に常にIntellisenseなどを使用してVisual Studioで記述されます。 それを作成した人々がそのように使用するように設計されています。 C ++で開発するためにIDEを使用する人の数に関係なく、そのユースケースを圧倒的な懸念として設計されていません。

名前空間は、C ++よりもC#の方がはるかに「細かい粒状」であるように見えます。

はい、それも。 「名前空間std」と「System.Collection.Genericの使用」は比較できません。

したがって、それらを比較しないでください。!

解説 (5)