Почему директива "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

Если вы не язык-пурист, это экономит время и упрощает кодирование. Если вы не имеете дело со сложными системами пространств имен, это вполне приемлемо.