Что такое "статический" класс? - PullRequest
40 голосов
/ 29 марта 2009

В C # какая разница между:

public static class ClassName {}

И

public class ClassName {}

Ответы [ 10 ]

67 голосов
/ 29 марта 2009

Во-первых, комментарий к ответу на вопрос о том, что означает «статический». В терминах C # «статический» означает «относящийся к самому типу, а не к экземпляру типа». Вы получаете доступ к статическому члену (из другого типа), используя имя типа вместо ссылки или значения. Например:

// Static method, so called using type name
Guid someGuid = Guid.NewGuid();
// Instance method, called on a value
string asString = someGuid.ToString();

Теперь статические классы ...

Статические классы обычно используются как "служебные" классы. Канонический пример, вероятно, System.Math. Создавать экземпляр математики не имеет смысла - это просто «есть». Несколько правил («можно» и «нельзя»):

  • Статические классы всегда происходят от object. Вы не можете указать другой базовый тип или заставить статический класс реализовать интерфейс.
  • Статические классы не могут иметь никаких элементов экземпляра - все переменные, методы и т. Д. Должны быть статическими.
  • Статические классы не могут объявлять конструкторы экземпляров, и компилятор не создает конструктор без параметров по умолчанию. (До того, как в C # 2.0 появились статические классы, люди часто создавали абстрактный класс с закрытым конструктором, который предотвращал создание экземпляров. Здесь нет необходимости.)
  • Статические классы неявно являются абстрактными (то есть они скомпилированы в IL, который описывает абстрактный класс), но вы не можете добавить модификатор abstract самостоятельно.
  • Статические классы неявно запечатаны (т.е. они скомпилированы в IL, который описывает запечатанный класс), но вы не можете добавить модификатор sealed самостоятельно.
  • Статические классы могут быть общими.
  • Статические классы могут быть вложены в нестатические или статические классы.
  • Статические классы могут иметь вложенные типы, нестатические или статические.
  • Методы расширения могут содержать только статические неуниверсальные классы верхнего уровня (C # 3.0).
39 голосов
/ 29 марта 2009

Статический класс не может быть создан и может содержать только статические члены. Следовательно, вызовы для статического класса: MyStaticClass.MyMethod(...) или MyStaticClass.MyConstant.

Нестатический класс может быть создан и может содержать нестатические члены (конструкторы экземпляров, деструктор, индексаторы). Нестатический член нестатического класса вызывается только через объект:

MyNonStaticClass x = new MyNonStaticClass(...);
x.MyNonStaticMethod(...);
6 голосов
/ 29 марта 2009
public static class ClassName {}

Статический класс подобен глобальной переменной: вы можете использовать его в любом месте своего кода, не создавая его экземпляров. Например: ClassName. После оператора точка можно использовать любое свойство или функцию.

 public class ClassName {}

Но если у вас есть нестатический класс, вам нужно создать экземпляр этого класса. Например:

 ClassName classNameObject = new ClassName(); 
6 голосов
/ 29 марта 2009

Статический класс также не может быть унаследован от, тогда как нестатический класс со статическими членами может быть унаследован от.

5 голосов
/ 29 марта 2009

Все методы / свойства в статическом классе должны быть статическими, тогда как «нормальный» класс может содержать сочетание экземпляра и статических методов.

3 голосов
/ 29 марта 2009

Вы не можете создавать (создавать объекты) статический класс. И он может содержать только статические элементы.

Пример: System.Math

3 голосов
/ 29 марта 2009

Статический класс может содержать только статические члены.

Статический член может использоваться без создания экземпляра класса.

2 голосов
/ 19 августа 2010

http://www.javaworld.com/javaworld/javaqa/1999-08/01-qa-static2.html - очень хорошая статья на эту тему. Это для Java. Но я думаю, что концепция должна быть такой же в C #.

2 голосов
/ 29 марта 2009

Статические классы и члены используются для создания данных и методов, к которым можно обращаться без создания экземпляра (используя ключевое слово new, они не могут иметь конструктор) класса.

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

Эти классы загружаются CLR, когда загружается программа или пространство имен, содержащее класс.

Они также запечатаны, не могут быть унаследованы от.

1 голос
/ 06 октября 2013

Статическая переменная в с

переменная, локальная для класса как авто переменные но статические переменные не исчезают, так как функция больше не активна. Их значения сохраняются. Если управление возвращается, статические переменные имеют то же значение

статическая функция в с функции, которые не видны функциям в других файлах.

* члены статических данных в cpp * члены данных могут быть переменными или функциями в cpp static применяется к обоим элементам данных сам класс может быть статическим «Существует только одна копия статических данных-членов, совместно используемая всеми объектами в этом классе» члены статических данных могут иметь доступ только к членам статических данных

статический класс этот класс не может создавать объекты

...