При написании рекурсивных методов следует непременно указать в соответствующем месте условный оператор, например if
, чтобы организовать возврат из метода без рекурсии. В противном случае возврата из вызванного однажды рекурсивного метода может вообще не произойти. Подобного рода ошибка весьма характерна для реализации рекурсии в практике программирования. В этом случае рекомендуется пользоваться операторами, содержащими вызовы метода WriteLine(),
чтобы следить за происходящим в рекурсивном методе и прервать его выполнение, если в нем обнаружится ошибка.
Применение ключевого слова static
Иногда требуется определить такой член класса, который будет использоваться независимо от всех остальных объектов этого класса. Как правило, доступ к члену класса организуется посредством объекта этого класса, но в то же время можно создать член класса для самостоятельного применения без ссылки на конкретный экземпляр объекта. Для того чтобы создать такой член класса, достаточно указать в самом начале его объявления ключевое слово static
. Если член класса объявляется как static
, то он становится доступным до создания любых объектов своего класса и без ссылки на какой-нибудь объект. С помощью ключевого слова static
можно объявлять как переменные, так и методы. Наиболее характерным примером члена типа static
служит метод Main(),
который объявляется таковым потому, что он должен вызываться операционной системой в самом начале выполняемой программы.
Для того чтобы воспользоваться членом типа static
за пределами класса, достаточно указать имя этого класса с оператором-точкой. Но создавать объект для этого не нужно. В действительности член типа static
оказывается доступным не по ссылке на объект, а по имени своего класса. Так, если требуется присвоить значение 10 переменной count типа static
, являющейся членом класса Timer
, то для этой цели можно воспользоваться следующей строкой кода.
Timer.count = 10;
Эта форма записи подобна той, что используется для доступа к обычным переменным экземпляра посредством объекта, но в ней указывается имя класса, а не объекта. Аналогичным образом можно вызвать метод типа static
, используя имя класса и оператор-точку. ,
Переменные, объявляемые как static
, по существу, являются глобальными. Когда же объекты, объявляются в своем классе, то копия переменной типа static
не создается. Вместо этого все экземпляры класса совместно пользуются одной и той же переменной типа static
. Такая переменная инициализируется перед ее применением в классе. Когда же ее инициализатор не указан явно, то она инициализируется нулевым значением, если относится к числовому типу данных, пустым значением, если относится к ссылочному типу, или же логическим значением false
, если относится к типу bool
. Таким образом, переменные типа static
всегда имеют какое-то значение.
Метод типа static
отличается от обычного метода тем, что его можно вызывать по имени его класса, не создавая экземпляр объекта этого класса. Пример такого вызова уже приводился ранее. Это был метод Sqrt()
типа static
, относящийся к классу System.Math
из стандартной библиотеки классов С#.
Ниже приведен пример программы, в которой объявляются переменная и метод типа 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
, поскольку такой метод не выполняется относительно какого-либо объекта.