Ключевое слово static

96

Иногда требуется определить такой член класса, который будет использоваться независимо от всех остальных объектов этого класса. Как правило, доступ к члену класса организуется посредством объекта этого класса, но в то же время можно создать член класса для самостоятельного применения без ссылки на конкретный экземпляр объекта. Для того чтобы создать такой член класса, достаточно указать в самом начале его объявления ключевое слово 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 накладывается ряд следующих ограничений:

Статические конструкторы

Конструктор можно также объявить как 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();
        }
    }
}
Использование статических классов

Стоит отметить, что для статического класса не допускается наличие конструктора экземпляра, но у него может быть статический конструктор.

Пройди тесты
Лучший чат для C# программистов