В чем разница между статическим классом и пространством имен? (в С#)

Единственное различие, которое я вижу, это тот факт, что вы не можете использовать объявление "using staticClass". Поэтому мне интересно:

(1) Существует ли реальная разница между статическим классом и пространством имен?

(2) Есть ли возможность избежать необходимости переписывать имя класса каждый раз, когда вызывается функция-член? Я думаю о чем-то аналогичном "использованию staticClass".

Ответ 1

Да, класс static является технически типом. Он может иметь членов (поля, методы, события). Пространство имен может содержать только типы (и оно само по себе не считается "типом"; typeof(System) является ошибкой времени компиляции).

Нет прямого эквивалента добавлению директивы using для пространства имен для статического класса. Вы можете, однако, объявить псевдонимы:

using ShortName = ReallyReallyLongStaticClassName;

и используйте

ShortName.Member

при обращении к своим членам.

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

public static class IntExtensions {
   public static int Square(this int i) { return i * i; }
}

и используйте его как:

int i = 2;
int iSquared = i.Square(); // note that the class name is not mentioned here.

Конечно, вам нужно будет добавить директиву using для пространства имен, содержащего класс, для использования метода расширения, если класс не объявлен в корневом или текущем пространстве имен.

Ответ 2

Статический класс по-прежнему является классом. Он может содержать методы, свойства и т.д. Пространство имен - это просто пространство имен. Это просто помощник, чтобы различать объявления классов с тем же именем.

Функция не может жить в одном пространстве имен, она принадлежит классу.

Расширения, вероятно, вы ищете, если вам нужна статическая функция без упоминания имени класса.

public static class MathExtensions
{
 public static int Square(this int x)
 {
  return x * x;
 }
}
//...
// var hundredSquare = 100.Square();

Ответ 3

Еще одно отличие состоит в том, что пространства имен могут охватывать несколько сборок, а классы не могут.

Ответ 4

Насколько я понимаю, пространства имен - это только языковая функция; они удаляются путем компиляции. Другими словами, среда выполнения .NET не "видит" пространства имен, а просто имена классов, которые содержат точки. Например, класс String в пространстве имен System рассматривается средой .NET как класс с именем System.String, но понятия пространства имен вообще не существует.

Статические классы, однако, полностью понятны и управляются средой выполнения .NET. Они являются полноценными типами, и вы можете использовать отражение на них.