У меня есть опыт работы с C ++, и я полностью понимаю и согласен с ответами на этот вопрос: Почему «используется пространство имен std;» считается плохой практикой?
Так что я удивлен, что, имея некоторый опыт работы с C# сейчас, я вижу прямо противоположное: using Some.Namespace;
буквально используется везде. Всякий раз, когда вы начинаете использовать тип, вы сначала добавляете директиву using для его пространства имен (если его там еще нет). Я не могу вспомнить, чтобы видел .cs
-файл, который не начинался с using System; using System.Collections.Generic; using X.Y.Z; etc...
. Фактически, если вы добавляете новый файл с помощью мастера Visual Studio, он автоматически добавляет туда некоторые директивы using, даже если они вам вообще не нужны. Так что, хотя в сообществе C ++ вас в основном линчуют, C# даже поощряет это делать. По крайней мере, так мне кажется.
Теперь я понимаю, что использование директив в C# и C ++ - это не одно и то же. Кроме того, я понимаю, что одна из самых неприятных вещей, которые вы можете сделать с using namespace
в C ++, а именно поместить ее в файл заголовка, не имеет аналогично неприятного аналога в C# из-за отсутствия концепции заголовочных файлов и #include
.
Однако, несмотря на их различия, использование директив в C# и C ++ преследует одну и ту же цель: приходится только постоянно набирать SomeType
, а не намного дольше Some.Namespace.SomeType
( в C ++ с ::
вместо .
). И с этой же целью мне кажется, что опасность та же: именование коллизий.
В лучшем случае это приводит к ошибке компиляции, поэтому вам «только» нужно ее исправить. В худшем случае, он все еще компилируется, и код молча делает разные вещи, чем вы предполагали. Итак, мой вопрос: Почему (по-видимому) используются директивы, которые считаются столь неравномерно плохими в C# и C ++?
Некоторые идеи ответа, которые у меня есть (ни одно из них действительно не удовлетворяет меня хотя):
Пространства имен имеют тенденцию быть намного длиннее и гораздо более вложенными в C#, чем в C ++ (std
против System.Collection.Generic
). Таким образом, есть больше желания и больше выгоды в устранении шума в коде таким образом. Но даже если это так, этот аргумент применяется только тогда, когда мы смотрим на стандартные пространства имен. Пользовательские могут иметь любое короткое имя, которое вам нравится, как в C#, так и в C ++.
Пространства имен кажутся гораздо более «мелкозернистыми» в C#, чем в C ++. Например, в C ++ вся стандартная библиотека содержится в std
(плюс несколько крошечных вложенных пространств имен, таких как chrono
), в то время как в C# у вас есть System.IO
, System.Threading
, System.Text
et c. Таким образом, риск возникновения коллизий именования меньше. Тем не менее, это только внутреннее чувство. На самом деле я не посчитал, сколько имен вы «импортируете» с using namespace std
и using System
. И снова, даже если это так, этот аргумент применяется только при рассмотрении стандартных пространств имен. Ваши собственные могут быть спроектированы так же хорошо, как вы, sh, как в C#, так и в C ++.
Есть еще аргументы? Я особенно заинтересован в реальных фактах (если они есть), а не в мнениях.