Декларация нечетного пространства имен - PullRequest
1 голос
/ 22 июля 2011

Итак, я просматривал какой-то старый код на работе и натолкнулся на следующее:

using Int16 = System.Int16;
using SqlCommand = System.Data.SqlClient.SqlCommand;

Я никогда раньше не видел, чтобы Декларация пространства имен использовала '='.Какой смысл его использовать?Есть ли какая-то польза от объявления вещей таким образом?

Что еще удивляет меня, так это тот факт, что они даже обеспокоены объявлением Int16.Разве Visual Studio не знает, что такое Int16, просто набрав его?

Ответы [ 3 ]

3 голосов
/ 22 июля 2011

Первая строка имеет ... эээ ... небольшой смысл, но это не импорт пространства имен; это псевдоним типа . Например, int является псевдонимом для Int32. Вы совершенно свободны в создании собственных псевдонимов, как показано в примере.

Например, допустим, вам нужно импортировать пространства имен с двумя типами с одинаковыми именами (на ум приходят System.Drawing.Point и System.Windows.Point ...). Вы можете создать псевдоним, чтобы избежать полной квалификации двух типов в вашем коде.

using WinFormsPoint = System.Drawing.Point;
using WpfPoint = System.Windows.Point;

void ILikeMyPointsStructy( WinFormsPoint p ) { /* ... */ }
void IPreferReferenceTypesThankYou( WpfPoint p ) { /* ... */ }
2 голосов
/ 22 июля 2011

Псевдоним пространства имен удобен для упрощения доступа к определенным типам, особенно если у вас много типов с конфликтующими именами.

Например, если вы ссылаетесь на пару разных пространств имен, в которых вы определили разные наборы констант, например:

namespace Library
{
   public static class Constants
   {
      public const string FIRST = "first";
      public const string SECOND = "second";
   }
}

namespace Services
{
   public static class Constants
   {
      public const string THIRD = "third";
      public const string FOURTH = "fourth";
   }
}

Затем вы решаете использовать оба в файле кода - вы получите ошибку компиляции, просто написав:

var foo = Constants.FIRST;

Альтернатива состоит в том, чтобы полностью определить ваши константы, что может быть неприятно, поэтому псевдоним пространства имен упрощает его:

using Constants = Library.Constants;
using ServiceConstants = Service.Constants;

При этом я не знаю, почему вы называете Int16 как Int16!

1 голос
/ 22 июля 2011

Для разработчиков, пришедших из C ++ фона, конструкция также может использоваться как своего рода «локальный typedef», который помогает упростить общие определения контейнеров: -

using Index = Dictionary<string, MyType>;

private Index BuildIndex(. . .)
{
  var index = new Index();
  . . .
  return index;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...