Ниже приведен пример программы, в которой объявляются переменная и метод типа static.
// Использовать модификатор static.
using System;
class StaticDemo {
// Переменная типа static, public static int Val = 100;
// Метод типа static, public static int ValDiv2 { return Val/2;
}
}
class SDemo {
static void Main {
Console.WriteLine("Исходное значение переменной " +
"StaticDemo.Val равно " + StaticDemo.Val);
StaticDemo.Val = 8;
Console.WriteLine("Текущее значение переменной" +
"StaticDemo.Val равно " + StaticDemo.Val);
Console.WriteLine("StaticDemo.ValDiv2: " + StaticDemo.ValDiv2);
}
}
Выполнение этой программы приводит к следующему результату.
Исходное значение переменной StaticDemo.Val равно 100 Текущее значение переменной StaticDemo.Val равно 8 StaticDemo.ValDiv2: 4
Как следует из приведенного выше результата, переменная типа static инициализируется до создания любого объекта ее класса.
На применение методов типа static накладывается ряд следующих ограничений.
• В методе типа static должна отсутствовать ссылка this, поскольку такой метод не выполняется относительно какого-либо объекта.
• В методе типаstaticдопускается непосредственный вызов только других методов типаstatic,но не метода экземпляра из того самого же класса. Дело в том, что методы экземпляра оперируют конкретными объектами, а метод типаstaticне вызывается для объекта. Следовательно, у такого метода отсутствуют объекты, которыми он мог бы оперировать.
• Аналогичные ограничения накладываются на данные типаstatic.
Ниже приведен пример класса, в котором недопустим методValDivDenom типаstatic.
class StaticError {
public int Denom =3; // обычная переменная экземпляра public static int Val = 1024; // статическая переменная
/* Ошибка! Непосредственный доступ к нестатической переменной из статического метода недопустим. */ static int ValDivDenom {
return Val/Denom; // не подлежит компиляции!
}
}
В данном примере кодаDenomявляется обычной переменной, которая недоступна из метода типаstatic.Но в то же время в этом методе можно воспользоваться переменнойVal,поскольку она объявлена какstatic.
Аналогичная ошибка возникает при попытке вызвать нестатический метод из статического метода того же самого класса, как в приведенном ниже примере.
using System;
class AnotherStaticError {