У мене є C ++ фон, і я повністю розумію і погоджуюся з відповідями на це питання: Чому "використовується простір імен std;" вважається поганою практикою?
Тож я здивований, що, маючи певний досвід роботи з C # зараз, я бачу саме навпаки:
using Some.Namespace;
буквально використовується скрізь. Щоразу, коли ви починаєте використовувати тип, спочатку додаєте директиву використання для його простору імен (якщо її вже немає). Я не можу згадати, як я бачив .cs
-файл, з якого не починався using System; using System.Collections.Generic; using X.Y.Z; etc...
. Насправді, якщо ви додасте новий файл за допомогою майстра Visual Studio, він автоматично додає туди деякі директиви, що використовують, навіть якщо вони вам зовсім не потрібні. Тож, перебуваючи в спільноті 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)
який називається via t.Ext(0)
. Якщо ви додасте інше простір імен, що містить метод розширення Ext(this T t, int i)
, він буде викликаний замість цього. Але я не є експертом у C # (поки що).