Модификатор **static** позволяет сделать доступ к классам или member’ам глобальным (то есть доступным из любого места кода).
Доступ к статическому member’у можно получить без определения экземпляра класса.
```csharp
Stata.status();
```
### Класс
Как сделать класс статическим
```csharp
public static class Credentials { }
```
Если сделать класс статическим, то внутри этого класса могут быть только статические member’ы
### Member класса
Как сделать member статическим
```csharp
public static void SetCookie() { }
public static string Password { get; }
public static string Login;
```
Доступ к статическому member’у можно получить без определения экземпляра класса.
```csharp
Credentials.SetCookie();
```
Если статический member находится в обычном классе (не статическом), то для доступа к member’у, НЕ нужно определять экземпляр данного класса.
Не рекомендуется вызывать static member у экземпляра, нужно это делать напрямую у класса.
В статическое поле/свойство можно многократно записывать и читать. Статическое - не значит константа.
У статического member’а нет доступа к this своего класса, потому что member находится в глобальной области памяти.
##### Как будет работать вызов статического метода в методе ребенка, который есть у отца и у дедушки?
Если класс Child наследует от класса Parent, который в свою очередь наследует от класса GrandParent, и каждый из этих классов имеет статический метод с одинаковым именем, то ситуация будет следующей:
Статический метод, вызванный от имени Child, будет соответствовать статическому методу, определенному в классе Parent, если таковой имеется, потому что Parent является непосредственным родителем Child. Если статический метод Parent не определен, то будет вызван статический метод из GrandParent.
Статические методы не участвуют в полиморфизме и не могут быть переопределены, но могут быть скрыты с использованием ключевого слова new.
В этом примере MyMethod из Parent скрывает MyMethod из GrandParent, поэтому Child.MyMethod() выводит "MyMethod from Parent". Если бы мы не определили MyMethod в Parent, Child.MyMethod() вызвал бы "MyMethod from GrandParent".
```csharp
class GrandParent
{
public static void MyMethod()
{
Console.WriteLine("MyMethod from GrandParent");
}
}
class Parent : GrandParent
{
public new static void MyMethod()
{
Console.WriteLine("MyMethod from Parent");
}
}
class Child : Parent
{
public static void ExecuteMethod()
{
// вызовет "MyMethod from Parent", поскольку
// статический метод Parent.MyMethod скрывает GrandParent.MyMethod
MyMethod();
}
}
```
### Наследование работает со статическими классами?
Статические классы в C# не могут быть наследниками и не могут быть наследуемыми. Это обусловлено самой идеей статического класса - он предназначен для представления группы методов и свойств, которые не зависят от конкретного экземпляра класса. Все члены статического класса также должны быть статическими, и этот класс не может быть инстанциирован.
Статические классы обычно используются для предоставления вспомогательных функций и утилит, которые не требуют сохранения состояния или доступа к специфическим данным экземпляра.
Наследование, с другой стороны, связано с созданием иерархии классов, где каждый класс расширяет или специализирует поведение базового класса. Это требует возможности создания экземпляров класса, что является противоположностью идеи статических классов.
Так что, нет, статические классы не поддерживают наследование.