Использование global :: для конфликтующих пространств имен - PullRequest
9 голосов
/ 10 октября 2009

Насколько я понимаю, квалификатор global:: позволяет вам получить доступ к пространству имен, которое было скрыто другим с таким же именем. Страница MSDN использует System в качестве примера. Если вы создаете свое собственное пространство имен System, вы можете достичь оригинала с помощью global::System. Первое, что пришло в голову, это зачем кому-то называть свое пространство имен System ?? Далее на странице говорится, что это явно не рекомендуется, но дублирование пространства имен очень возможно в больших проектах. Если / когда это происходит, это признак того, что все идет не в том направлении, или есть веские причины иметь конфликтующие пространства имен?

Ответы [ 5 ]

13 голосов
/ 10 октября 2009

Как правило, global:: используется для обозначения «Я хочу начать с верхней части структуры пространства имен». Если у меня есть пространство имен с именем MyProduct.System, то все, что находится в пространстве имен MyProduct, не сможет получить доступ к пространству имен Microsoft System. Это запах кода? Может быть, иногда, но не особенно вонючий.

7 голосов
/ 10 октября 2009

Одной из законных причин наличия конфликтующих пространств имен может быть использование собственных библиотек, написанных для более ранних версий .Net, которые не содержали функциональности, добавленной в более поздних версиях. Например, в .Net 1.1 дней я написал класс Registry, который обернул вызовы реестра API. По чистой случайности названия методов, которые я выбрал, были точно такими же, как и в более позднем классе .Net Registry, и они делали точно такие же вещи, поэтому было легко отключить мой доморощенный код. Для более сложных вещей может пригодиться возможность использовать более старый, плохо названный кусок кода с квалификатором global::.

Умышленное присвоение имени новому коду с использованием существующего пространства имен .Net, безусловно, будет запахом кода.

7 голосов
/ 10 октября 2009

Любой машинно-сгенерированный код должен попытаться использовать global::, чтобы минимизировать вероятность конфликтов пространства имен, о которых он может не знать. Более того, любой ваш код, который может столкнуться с конфликтами, может использовать его, чтобы быть более конкретным.

2 голосов
/ 10 октября 2009

У Microsoft есть несколько хороших рекомендаций по пространству имен в превосходной книге Framework Design Guidelines 2nd Ed.. В целом, они не рекомендуют вводить комфлеты (например, называя ваш тип Stream).

Не думаю, что когда-либо использовал квалификатор global ::. Я бы вообще считал это запахом кода (хотя бывают исключения, как указывают MusiGenesis и Sixlettervariables).

0 голосов
/ 10 октября 2009

Я думаю, что время от времени случается так, что одно из ваших пространств имен называется другим. Например, у меня есть пространство имен .Persistence.NHibernate, где NHibernate также может быть корневым пространством имен сборки NHibernate.

Я не вижу здесь никакого запаха кода, он просто называет isses;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...