using System;
class Cons {
public static int alpha;
public int beta;
// Статический конструктор.
static Cons() {
alpha = 99;
Console.WriteLine("В статическом конструкторе.");
}
// Конструктор экземпляра.
public Cons() {
beta = 100;
Console.WriteLine("В конструкторе экземпляра.");
}
}
class ConsDemo {
static void Main() {
Cons ob = new Cons();
Console.WriteLine("Cons.alpha: " + Cons.alpha);
Console.WriteLine("ob.beta: " + ob.beta);
}
}
При выполнении этого кода получается следующий результат.
В статическом конструкторе.
В конструкторе экземпляра.
Cons.alpha: 99
ob.beta: 100
Обратите внимание на то, что конструктор типа static
вызывается автоматически, когда класс загружается впервые, причем до конструктора экземпляра. Из этого можно сделать более общий вывод: статический конструктор должен выполняться до любого конструктора экземпляра. Более того, у статических конструкторов отсутствуют модификаторы доступа — они пользуются доступом по умолчанию, а следовательно, их нельзя вызывать из программы.
Класс можно объявлять как static
. Статический класс обладает двумя основными свойствами. Во-первых, объекты статического класса создавать нельзя. И во-вторых, статический класс должен содержать только статические члены. Статический класс создается по приведенной ниже форме объявления класса, видоизмененной с помощью ключевого слова static.
static class имя_класса { // ...
В таком классе все члены должны быть объявлены как static
. Ведь если класс становится статическим, то это совсем не означает, что статическими становятся и все его члены.
Статические классы применяются главным образом в двух случаях. Во-первых, статический класс требуется при создании метода расширения. Методы расширения связаны в основном с языком LINQ и поэтому подробнее рассматриваются в главе 19. И во-вторых, статический класс служит для хранения совокупности связанных друг с другом статических методов. Именно это его применение и рассматривается ниже.
В приведенном ниже примере программы класс NumericFn
типа static
служит для хранения ряда статических методов, оперирующих числовым значением. А поскольку все члены класса NumericFn
объявлены как static
, то этот класс также объявлен как static
, чтобы исключить получение экземпляров его объектов. Таким образом, класс NumericFn
выполняет организационную роль, предоставляя удобные средства для группирования логически связанных методов.
// Продемонстрировать применение статического класса.
using System;
static class NumericFn {
// Возвратить обратное числовое значение.
static public double Reciprocal(double num) {
return 1/num;
}
// Возвратить дробную часть числового значения.
static public double FracPart(double num) {
return num - (int) num;
}
// Возвратить логическое значение true, если числовое
// значение переменной num окажется четным.
static public bool IsEven(double num) {
return (num % 2) == 0 ? true : false;
}
// Возвратить логическое значение true, если числовое
// значение переменной num окажется нечетным,
static public bool IsOdd(double num) {
return !IsEven(num);
}
}
class StaticClassDemo {
static void Main() {
Console.WriteLine("Обратная величина числа 5 равна " +
NumericFn.Reciprocal(5.0) ) ;
Console.WriteLine("Дробная часть числа 4.234 равна " +
NumericFn.FracPart(4.234));
if(NumericFn.IsEven(10))
Console.WriteLine("10 — четное число.");
if(NumericFn.IsOdd(5))
Console.WriteLine("5 — нечетное число.");
// Далее следует попытка создать экземпляр объекта класса NumericFn,
// что может стать причиной появления ошибки.
// NumericFn ob = new NumericFn(); // Ошибка!
Читать дальше