Часто замечаю код где библиотеки подключаются не перед 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
Комментариев нет:
Отправить комментарий