У меня есть опыт работы с 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
т. Д. Таким образом, риск возникновения коллизий именования меньше. Тем не менее, это только внутреннее чувство. На самом деле я не посчитал, сколько имен вы «импортируете» с помощьюusing namespace std
иusing System
. И снова, даже если это так, этот аргумент применяется только при рассмотрении стандартных пространств имен. Ваши собственные могут быть спроектированы так, как вы хотите, на C # и C ++.
Есть ли еще аргументы? Я особенно заинтересован в реальных фактах (если они есть), а не во мнениях.
Ext(this T t, long l)
который вызывается через t.Ext(0)
. Если затем вы добавите другое пространство имен, содержащее метод расширения Ext(this T t, int i)
, оно будет вызываться вместо этого. Но я не эксперт в C # (пока).