Почему директива "using namespace" принимается в С#?
Мне просто интересно узнать, почему директива "using namespace" приемлема в С#, хотя на С++ это не так. Я знаю, что С++ и С# отличаются друг от друга, но я думаю, что С++ и С# приходят почти из одного семейства и должны использовать те же идеи для разрешения пространства имен. С++ и С# имеют ключевое слово alias, чтобы обойти конфликт пространства имен.
Может ли кто-нибудь указать мне, что я не читаю между строками в С#, что делает приемлемым использование директивы "using namespace" и избежать проблем, которые С++ не может.
Ответы
Ответ 1
В С++, если вы пишете using namespace
в заголовке, то это будет действовать для всех, кто включает этот заголовок. Это делает его довольно непригодным для использования в заголовках. В этот момент вы также можете избежать этого (в глобальном масштабе) в .cpp файлах, если только ради согласованности, и облегчите переносимые реализации между .h и .cpp.
(обратите внимание, что локально локализованные using namespace
- то есть внутри функции - обычно считаются точными, а просто они не помогают с многословием)
В С# нет ничего подобного #include
, и область действия директивы using
никогда не будет за пределами одного файла .cs. Поэтому он практически безопасен для использования везде.
Другая причина - это дизайн стандартной библиотеки. В С++ у вас есть только std
(ну, теперь еще несколько под ним, но они редко используются). В С# у вас есть драгоценные камни, такие как System.Collections.Generic
, что очень многословно для того, что используется очень часто. Гораздо больнее избегать using
в С#, чем в С++.
Подводя итог, в то время как С# и С++ имеют общий дизайн, в отношении модульности кода (я бы назначил заголовки, модули, пространства имен для этой группы), их дизайн сильно отличается.
Ответ 2
Для меня это сводится к инструментам поддержки. Intellisense, быстрый поиск в классе (клавиша F1) и варианты рефакторинга Visual Studio дают необходимую функциональность для поиска ссылок.
Кроме того, у С# есть каждый метод внутри класса - нет функций уровня пространства имен.
Ответ 3
В целом разница С# и С++ заключается в том, как обрабатываются и задаются единицы компиляции.
С++ использует заголовочные файлы для публикации объявлений классов и нуждается в компиляционной единице, где этот класс реализован (определен). Оператор using namespace <xxx>
в файлах заголовков настоятельно не рекомендуется для С++, потому что это может легко привести к конфликтам пространства имен и неоднозначностям, если они включены из некоторого кода клиента. В объявлении класса вы должны явно указать, что хотите от других пространств имен (включая std
).
С# имеет отдельные единицы компиляции, которые немного облегчают использование операторов using namespace <xxx>
. Тем не менее, я бы предпочел сглаживание импортированных пространств имен, если вы хотите избежать утомительной типизации. Размещение инструкций using
в файле .cs также может вызывать неоднозначные определения.
Ответ 4
Пока я полностью согласен с другими, что использование пространств имен не должно выполняться в заголовках, я думаю, что запрет их в файлах cpp близорук. Если вы пытаетесь придерживаться упорядочивания деклараций в пространствах имен "красиво", но затем запретите использование "использования пространства имен вообще", путь наименьшего сопротивления для кодеров становится используемым пространствами имен.
Например, в вышеприведенной статье Павла Минаева он справедливо указывает на разницу пространств имен между общим пространством имен С++, std и пространство имен С#, System.Collections.Generic. Если вы перестанете думать о , почему, это так, то явный ответ IMO - это то, что культура С++ недовольна использованием пространства имен, а С# - нет, поэтому в С# вы принимаете более подробные пространства имен, потому что они не являются неотъемлемо больно использовать. Я считаю, что организация пространства имен на С# намного лучше, чем С++, в основном из-за этой культурной разницы, а более хорошая организация классов и общая читаемость - это не тривиальные вещи.
Чтобы по-другому понять, подумайте о том, что произойдет с привычками организации файловой организации, если приложение потребовало, чтобы они вводили полные пути для загрузки файла. Theyd скорее всего просто запихнет все в корневую папку, чтобы избежать ввода, а не хороший способ повысить качество организации.
Хотя, конечно, не так просто, как использование директивы С# s, использование пространства имен в файлах cpp является общей победой.
Ответ 5
Если вы не язык-пурист, это экономит время и упрощает кодирование. Если вы не имеете дело со сложными системами пространств имен, это вполне приемлемо.