Ключевое слово static
96C# --- Руководство по C# --- Ключевое слово static
Иногда требуется определить такой член класса, который будет использоваться независимо от всех остальных объектов этого класса. Как правило, доступ к члену класса организуется посредством объекта этого класса, но в то же время можно создать член класса для самостоятельного применения без ссылки на конкретный экземпляр объекта. Для того чтобы создать такой член класса, достаточно указать в самом начале его объявления ключевое слово static.
Если член класса объявляется как static, то он становится доступным до создания любых объектов своего класса и без ссылки на какой-нибудь объект. С помощью ключевого слова static можно объявлять как переменные, так и методы. Наиболее характерным примером члена типа static служит метод Main(), который объявляется таковым потому, что он должен вызываться операционной системой в самом начале выполняемой программы.
Для того чтобы воспользоваться членом типа static за пределами класса, достаточно указать имя этого класса с оператором-точкой. Но создавать объект для этого не нужно. В действительности член типа static оказывается доступным не по ссылке на объект, а по имени своего класса.
Переменные, объявляемые как static, по существу, являются глобальными. Когда же объекты объявляются в своем классе, то копия переменной типа static не создается. Вместо этого все экземпляры класса совместно пользуются одной и той же переменной типа static. Такая переменная инициализируется перед ее применением в классе.
Пример использования ключевого слова static:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class myCircle
{
// 2 метода, возвращающие площадь и длину круга
public static double SqrCircle(int radius)
{
return Math.PI * radius * radius;
}
public static double LongCircle(int radius)
{
return 2 * Math.PI * radius;
}
}
class Program
{
static void Main(string[] args)
{
int r = 10;
// Вызов методов из другого класса
// без создания экземпляра объекта этого класса
Console.WriteLine("Площадь круга радиусом {0} = {1:#.##}",r,myCircle.SqrCircle(r));
Console.WriteLine("Длина круга равна {0:#.##}",myCircle.LongCircle(r));
Console.ReadLine();
}
}
}
На применение методов типа static накладывается ряд следующих ограничений:
В методе типа static должна отсутствовать ссылка this, поскольку такой метод не выполняется относительно какого-либо объекта
В методе типа static допускается непосредственный вызов только других методов типа static, но не метода экземпляра из того самого же класса. Дело в том, что методы экземпляра оперируют конкретными объектами, а метод типа static не вызывается для объекта. Следовательно, у такого метода отсутствуют объекты, которыми он мог бы оперировать
Аналогичные ограничения накладываются на данные типа static. Для метода типа static непосредственно доступными оказываются только другие данные типа static, определенные в его классе. Он, в частности, не может оперировать переменной экземпляра своего класса, поскольку у него отсутствуют объекты, которыми он мог бы оперировать
Статические конструкторы
Конструктор можно также объявить как static. Статический конструктор, как правило, используется для инициализации компонентов, применяемых ко всему классу, а не к отдельному экземпляру объекта этого класса. Поэтому члены класса инициализируются статическим конструктором до создания каких-либо объектов этого класса:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class MyClass
{
public static int a;
public int b;
// Статический конструктор
static MyClass()
{
a = 10;
}
// Обычный конструктор
public MyClass()
{
b = 12;
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Доступ к экземпляру класса a: " + MyClass.a);
MyClass obj = new MyClass();
Console.WriteLine("Доступ к экземпляру класса b: " + obj.b);
Console.ReadLine();
}
}
}
Обратите внимание на то, что конструктор типа static вызывается автоматически, когда класс загружается впервые, причем до конструктора экземпляра. Из этого можно сделать более общий вывод: статический конструктор должен выполняться до любого конструктора экземпляра. Более того, у статических конструкторов отсутствуют модификаторы доступа — они пользуются доступом по умолчанию, а следовательно, их нельзя вызывать из программы.
Статические классы
Класс можно объявлять как static. Статический класс обладает двумя основными свойствами. Во-первых, объекты статического класса создавать нельзя. И во-вторых, статический класс должен содержать только статические члены. Статический класс создается по приведенной ниже форме объявления класса, видоизмененной с помощью ключевого слова static.
static class имя класса { // ...
Статические классы применяются главным образом в двух случаях. Во-первых, статический класс требуется при создании метода расширения. Методы расширения связаны в основном с языком LINQ. И во-вторых, статический класс служит для хранения совокупности связанных друг с другом статических методов:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
// В данном классе инкапсулируются статические методы
// выполняющие простейшие операции
static class MyMath
{
// Целая часть числа
static public int round(double d)
{
return (int)d;
}
// Дробная часть числа
static public double doub(double d)
{
return d - (int)d;
}
// Квадрат числа
static public double sqr(double d)
{
return d * d;
}
// Квадратный корень числа
static public double sqrt(double d)
{
return Math.Sqrt(d);
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Исходное число: 12.44\n\n--------------------\n");
Console.WriteLine("Целая часть: {0}",MyMath.round(d: 12.44));
Console.WriteLine("Дробная часть числа: {0}",MyMath.doub(d: 12.44));
Console.WriteLine("Квадрат числа: {0:#.##}",MyMath.sqr(d: 12.44));
Console.WriteLine("Квадратный корень числа: {0:#.###}",MyMath.sqrt(d: 12.44));
Console.ReadLine();
}
}
}
Стоит отметить, что для статического класса не допускается наличие конструктора экземпляра, но у него может быть статический конструктор.