Страницы

Поиск по вопросам

понедельник, 8 октября 2018 г.

Подключение библиотек внутри namespace

Часто замечаю код где библиотеки подключаются не перед namespace, а внутри. Интересно почему так делают и какие принципиальные различия?
Привычный способ подключения:
using System; using System.Linq; using System.Collections.Generic; namespace Domain {
}
Способ подключения внутри namespace
namespace Domain { using System; using System.Linq; using System.Collections.Generic; }


Ответ

Перевод ответа на аналогичный вопрос на английском
Разница действительно есть. Представим, что есть файл File1.cs со следующим кодом:
// File1.cs using System; namespace Outer.Inner { class Foo { static void Bar() { double d = Math.PI; } } }
Теперь представим, что кто-то добавил еще один файл (File2.cs):
// File2.cs namespace Outer { class Math { } }
Компилятор найдет Outer до того как просмотрит using вне пространства имен, поэтому он найдет Outer.Math вместо System.Math. К несчастью (или возможно к счастью?), в Outer.Math нет члена PI, поэтому компилятор начнет ругаться на Math.PI в файле File1.cs
Все поменяется, если поместить using внутрь определения пространства имен, например так:
// File1b.cs namespace Outer.Inner { using System; class Foo { static void Bar() { double d = Math.PI; } } }
Теперь компилятор найдет System до Outer, и будет использовать System.Math, и все будет хорошо.
Некоторые утверждают, что Math это плохое имя для пользовательского класса, потому что такой класс уже есть в System; дело в том, что только здесь есть разница и это отразится на сопровождаемости кода.
Также интересно, что может случиться, если Foo будет объявлен в пространстве именOuter, а не Outer.Inner. В этом случае, добавление Outer.Math в File2 ломает File1 независимо от того, где расположены using. Это означает, что компилятор ищет в самом внутреннем пространстве имен, прежде чем смотреть в любых выражениях using

Комментариев нет:

Отправить комментарий