私はC ++のバックグラウンドを持っており、この質問に対する回答を完全に理解して同意します。悪い習慣と考えていますか?
だから、C#の経験があると、正反対のことがわかり
using Some.Namespace;
ます。文字通りどこでも使用されています。タイプの使用を開始するときはいつでも、そのネームスペースのusingディレクティブを最初に追加します(まだ存在しない場合)。.cs
で始まらなかった-file を見たことを思い出せませんusing System; using System.Collections.Generic; using X.Y.Z; etc...
。実際、Visual Studioウィザードを使用して新しいファイルを追加すると、必要がない場合でも、いくつかのusingディレクティブが自動的に追加されます。したがって、C ++コミュニティでは基本的にリンチされますが、C#でもこれを行うことを推奨しています。少なくともこれは私にはそれが見える方法です。
現在、C#とC ++でディレクティブを使用することはまったく同じではないことを理解しています。また、using namespace
C ++でできる最も厄介なことの1つ、つまりヘッダーファイルに配置することの1つは、ヘッダーファイルとの概念がないため、C#で同等に厄介なものがないことを理解しています#include
。
ただし、それらの違いにもかかわらず、C#とC ++でのディレクティブの使用は同じ目的に役立ちます。これはSomeType
、ずっと長くするのではなく、常に入力するだけで済みますSome.Namespace.SomeType
(C ++ ::
ではの代わりに.
)。これと同じ目的で、名前の衝突という危険も私には同じように見えます。
最良の場合、これによりコンパイルエラーが発生するため、修正する必要があるのは「のみ」です。最悪の場合でもコンパイルされ、コードは意図したものとは異なる動作をします。だから私の質問は:なぜ(どうやら)C#とC ++であまりにも悪いと考えられているディレクティブを使用しているのですか?
私が持っている答えのいくつかのアイデア(これらはどれも本当に私を満足させません):
名前空間は、C ++よりもC#の方がはるかに長く、ネストされる傾向があります(
std
vs.System.Collection.Generic
)。したがって、この方法でコードのノイズを除去することには、より多くの欲求と利益があります。しかし、これが真実であっても、この議論は標準の名前空間を調べたときにのみ適用されます。カスタムのものには、C#とC ++の両方で、任意の短い名前を付けることができます。名前空間は、C ++よりもC#の方がはるかに「細かい」ように見えます。例として、C ++では標準ライブラリ全体
std
(およびのようないくつかの小さなネストされた名前空間chrono
)が含まれますがSystem.IO
、C#ではSystem.Threading
、System.Text
などがあります。したがって、名前の衝突のリスクは小さくなります。しかし、これはただの直感です。私は実際にどのように多くの名前を使用すると、「インポート」カウントされませんでしたusing namespace std
とusing System
。繰り返しになりますが、これが真実であっても、この議論は標準の名前空間を見たときにのみ適用されます。独自のものは、C#とC ++の両方で、必要に応じて細かく設計できます。
もっと議論はありますか?私は実際の難しい事実(もしあれば)に特に興味があり、意見にはあまり興味がありません。
Ext(this T t, long l)
を介して呼び出される拡張メソッドを検討してくださいt.Ext(0)
。次に、拡張メソッドを含む別の名前空間を追加するとExt(this T t, int i)
、その名前空間が代わりに呼び出されます。しかし、私は(まだ)C#の専門家ではありません。