English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В C# статическое означает, что контент не может быть инстанцирован. Создание объектов статических классов невозможно, и к статическим членам нельзя обращаться через объект.
Классы, переменные, методы, свойства, операторы, события и конструкторы можно определить как статические с помощью ключевого слова static.
Чтобы сделать класс статическим, следует применить модификатор static перед именем класса и после доступа修饰ителя. Ниже приведен пример статического класса с статическими полями и методами.
public static class Calculator { private static int _resultStorage = 0; public static string Type = "Arithmetic"; public static int Sum(int num1, int num2) { return num1 + num2; } public static void Store(int result) { _resultStorage = result; } }
Приведенный выше класс Calculator является статическим. Все его члены также являются статическими.
Объекты статических классов создавать нельзя. Поэтому можно напрямую использовать имя класса ClassName.MemberName для доступа к членам статического класса, как показано ниже.
class Program { static void Main(string[] args) { var result = Calculator.Sum(10, 25); // Вызов статического метода Calculator.Store(result); var calcType = Calculator.Type; // Доступ к статической переменной Calculator.Type = "Scientific"; // Присваивание значения статической переменной } }
Статические классы не могут быть инстанцированы.
Все члены статического класса должны быть статическими. В противном случае, компилятор выдаст ошибку.
Статические классы могут содержать статические переменные, статические методы, статические свойства, статические операторы, статические события и статические конструкторы.
Статические классы не могут содержать членов экземпляра и конструкторы.
Индексаторы и деструкторы не могут быть статическими
Var не может использоваться для определения статических членов. Вы должны явно指定 тип члена после ключевого слова static.
Статические классы являются запечатанными, поэтому их нельзя наследовать.
Статические классы не могут наследоваться от других классов.
Статические члены класса можно получить доступ с помощью ClassName.MemberName (т.е. имя класса.имя члена)
Статические классы сохраняются в памяти на протяжении всего жизненного цикла приложения, в котором они используются.
Обычные классы (нестатические классы) могут содержать один или несколько статических методов, полей, свойств, событий и других нестатических членов.
Использование некоторых статических членов для определения нестатического класса, а не для объявления всего класса статическим, это более практично.
Статическое поле в нестатическом классе можно определить с использованием ключевого слова static.
Статические поля нестатического класса совместно используются между всеми экземплярами. Таким образом, изменения, сделанные одним экземпляром, будут отражены в других экземплярах.
public class StopWatch { public static int InstanceCounter = 0; // Конструктор экземпляра public StopWatch() { } } class Program { static void Main(string[] args) { StopWatch sw1 = new StopWatch(); StopWatch sw2 = new StopWatch(); Console.WriteLine(StopWatch.NoOfInstances); // 2 StopWatch sw3 = new StopWatch(); StopWatch sw4 = new StopWatch(); Console.WriteLine(StopWatch.NoOfInstances); // 4 } }
Вы можете определить один или несколько статических методов в нестатическом классе. Статические методы можно вызывать без создания объекта. Вы не можете вызывать статические методы с помощью объекта нестатического класса.
Статические методы могут вызывать только другие статические методы и доступ к статическим членам. Вы не можете получить доступ к нестатическим членам класса в статическом методе.
class Program { static int counter = 0; string name = "Demo Program"; static void Main(string[] args) { counter++; // можно получить доступ к статическому полю Display("Hello World!"); // можно вызвать статический метод name = "New Demo Program"; // Ошибка: не удалось получить доступ к нестатическому члену SetRootFolder("C:\MyProgram"); // Ошибка: не удалось вызвать нестатический метод } static void Display(string text) { Console.WriteLine(text); } public void SetRootFolder(string path) { } }
Статические методы могут быть определены с использованием ключевого слова static перед типом возвращаемого значения, а затем определены после доступа к модификатору.
Статические методы могут быть перегружены, но не могут быть переопределены.
Статические методы могут содержать локальные статические переменные.
Статические методы не могут обращаться или вызывать нестатические переменные, если они не передаются явно в качестве параметра.
Нестатический класс может содержать без параметров статический конструктор. Его можно определить с использованием ключевого слова static без доступных модификаторов доступа, таких как public, private и protected.
Ниже приведен пример, демонстрирующий различие между статическим конструктором и экземплярным конструктором.
public class StopWatch { // Статический конструктор static StopWatch() { Console.WriteLine("Было вызвано статический конструктор"); } // Конструктор экземпляра public StopWatch() { Console.WriteLine("Было вызвано экземплярный конструктор"); } // Метод статический public static void DisplayInfo() { Console.WriteLine("Было вызвано DisplayInfo"); } // Метод экземпляра public void Start() { } // Метод экземпляра public void Stop() { } }
Нестатический класс StopWatch содержит статический конструктор и нестатический конструктор.
Каждый раз при использовании статического метода или при первом создании экземпляра статический конструктор вызывается только один раз. Ниже приведен пример, показывающий, что при первом вызове статического метода вызывается статический конструктор. При повторном вызове статического метода статический конструктор не вызывается.
StopWatch.DisplayInfo(); // Здесь вызывается статический конструктор StopWatch.DisplayInfo(); // Здесь не вызывается конструктор
Статический конструктор был вызван. Было вызвано DisplayInfo Было вызвано DisplayInfo
Ниже приведен пример, показывающий, что при первом создании экземпляра вызывается статический конструктор.
StopWatch sw1 = new StopWatch(); // Сначала вызывается статический конструктор, затем экземплярный конструктор StopWatch sw2 = new StopWatch(); // Только вызывается экземплярный конструктор StopWatch.DisplayInfo();
Было вызвано статический конструктор Было вызвано экземплярный конструктор Было вызвано экземплярный конструктор Было вызвано DisplayInfo
Статический конструктор определен с использованием ключевого слова static и не использует доступные модификаторы доступа public, private или protected.
Нестатические классы могут содержать пустой статический конструктор. Запрещается использовать параметризованные статические конструкторы.
Статические конструкторы выполняются только один раз в течение жизни. Поэтому при использовании класса в нескольких местах невозможно определить, когда он вызывается в приложении.
Статические конструкторы могут обращаться только к статическим членам. Они не могут содержать или обращаться к членам экземпляра.
Статические члены хранятся в специальной области памяти, называемой «Высокочастотная куча». Статические члены нестатического класса разделяются между всеми экземплярами этого класса. Таким образом, изменения, сделанные одним экземпляром, отражаются на всех других экземплярах.