• В методе типа static
допускается непосредственный вызов только других методов типа static
, но не метода экземпляра из того самого же класса. Дело в том, что методы экземпляра оперируют конкретными объектами, а метод типа 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 {
// Нестатический метод.
void NonStaticMeth() {
Console.WriteLine("В методе NonStaticMeth().");
}
/* Ошибка! Непосредственный вызов нестатического метода из статического метода недопустим. */
static void staticMeth() {
NonStaticMeth(); // не подлежит компиляции!
}
}
В данном
Следует особо подчеркнуть, что из метода типа static
нельзя вызывать методы экземпляра и получать доступ к переменным экземпляра его класса, как это обычно делается посредством объектов данного класса. И объясняется это тем, что без указания конкретного объекта переменная или метод экземпляра оказываются недоступными. Например, приведенный ниже фрагмент кода считается совершенно верным.
class MyClass {
// Нестатический метод.
void NonStaticMeth() {
Console.WriteLine("В методе NonStaticMeth().");
}
/* Нестатический метод может быть вызван из статического метода по ссылке на объект. */
public static void staticMeth(MyClass ob) {
ob.NonStaticMeth(); // все верно!
}
}
В данном примере метод NonStaticMeth()
вызывается из метода staticMeth()
по ссылке на объект ob типа MyClass
.
Поля типа static
не зависят от конкретного объекта, и поэтому они удобны для хранения информации, применимой ко всему классу. Ниже приведен пример программы, демонстрирующей подобную ситуацию. В этой программе поле типа static служит для хранения количества существующих объектов.
// Использовать поле типа static для подсчета
// экземпляров существующих объектов.
using System;
class CountInst {
static int count = 0;
// Инкрементировать подсчет, когда создается объект.
public CountInst() {
count++;
}
// Декрементировать подсчет, когда уничтожается объект.
~CountInst() { count--;
}
public static int GetCount() {
return count;
}
}
class CountDemo {
static void Main() {
CountInst ob;
for(int i=0; i < 10; i++) {
ob = new CountInst();
Console.WriteLine("Текущий подсчет: " + CountInst.GetCount());
}
}
}
Выполнение этой программы приводит к следующему результату.
Текущий подсчет: 1
Текущий подсчет: 2