Объяснение статических классов и статических членов классов в C #

Ключевое слово static в языке программирования C # позволяет определять статические классы и статические члены.

Статический класс похож на абстрактный и запечатанный класс. Разница между статическим классом и нестатическим классом заключается в том, что статический класс не может быть создан или унаследован, и что все члены класса являются статическими по своей природе. Чтобы объявить класс статическим, вы должны пометить его ключевым словом static в объявлении класса. 

В статическом классе или члене нет поведения, поэтому нет никакого смысла разрешать наследование статического класса. Статический класс может иметь только статические члены - вы не можете объявлять члены экземпляра (методы, переменные, свойства и т. Д.) В статическом классе. Вы можете иметь статический конструктор в статическом классе, но не можете иметь конструктор экземпляра внутри статического класса.

Когда использовать статический класс в C #

Когда стоит переходить на статический класс? Обычно вы можете реализовать вспомогательные или служебные классы как статические классы, поскольку они не нуждаются в создании экземпляров или наследовании и обычно содержат коллекцию некоторых повторно используемых методов и свойств. В следующем листинге кода показано, как выглядит статический класс в C #.

общедоступный статический класс FileLogger

    {

        публичный статический журнал void (строковое сообщение)

        {

            // Метод записи данных в текстовый файл

        }

    }

Когда использовать статические методы в C #

Статические методы - это методы, которым не нужен экземпляр класса для вызова - их можно вызывать в самом классе. Обратите внимание, что статические методы могут обращаться только к статическим членам класса. У вас могут быть статические методы внутри статического класса или нестатического класса. Кроме того, у вас может быть статический конструктор в статическом или нестатическом классе. Статический конструктор используется для инициализации статических членов класса. Статический конструктор класса вызывается при первом обращении к статическому члену класса.

Почему мы должны использовать статические методы? Они выполняются немного быстрее, чем нестатические методы, то есть методы экземпляра. Причина в том, что среда выполнения передает thisуказатель в качестве неявного параметра нестатическим методам или методам экземпляра. Обратите внимание, что для нестатического метода компилятор выдает callvirtинструкцию, даже если метод не является виртуальным. Если вы сделаете свои методы статическими, компилятор будет генерировать не виртуальные callсайты, исключая дополнительную проверку того, является ли экземпляр нулевым. Это может дать вам некоторые преимущества в производительности.

Поэтому, если приложение, которое вы создаете, критично к производительности, возможно, стоит использовать статические типы и методы в вашем коде. Прирост производительности может быть заметным, если ваш код выполняет большое количество вызовов таких типов и членов.

В следующем фрагменте кода показано, как выглядит статический метод.

публичный статический журнал void (строковое сообщение)

        {

             string filePath = @ "F: \ Log.txt";

            используя (StreamWriter streamWriter = new StreamWriter (filePath, true))

            {

                streamWriter.WriteLine (сообщение);

                streamWriter.Close ();

            }

        }

Как использовать статические члены класса в C #

CLR делит системную память на три отдельные области: стек, кучу и высокочастотную кучу. Поскольку к статическим объектам можно обращаться напрямую, без создания экземпляров класса, они должны существовать в памяти на протяжении всего времени существования приложения; их не нужно собирать мусором. Поэтому статические объекты хранятся в высокочастотной куче. Обычно у вас есть одна высокочастотная куча для каждого домена приложения.

Давайте теперь посмотрим на статические члены класса. Опять же, статический объект - это объект, который сохраняется в памяти все время, пока приложение выполняется. Расширяя приведенный выше пример ведения журнала, следующий листинг кода показывает, как будет выглядеть класс FileLogger со статическими членами.

общедоступный статический класс FileLogger

    {

        частный статический объект только для чтения lockObject = new object ();

        общедоступная статическая строка FilePath

        {

            получить; набор;

        }

        публичный статический журнал void (строковое сообщение)

        {

            блокировка (lockObject)

            {

                если (! строка.IsNullOrEmpty (FilePath))

                используя (StreamWriter streamWriter = new StreamWriter (FilePath, true))

                {

                    streamWriter.WriteLine (сообщение);

                    streamWriter.Close ();

                }

            }

        }

    }

Обратите внимание на использование статического свойства с именем FilePath. Для обеспечения безопасности потоков lockбыло использовано ключевое слово. Внутри Log()метода была произведена проверка, чтобы убедиться, что значение FilePathсвойства не равно нулю и не пусто.

Помните, когда скорость приложения имеет существенное значение, может быть полезно использовать статические методы. Вы можете использовать их как в статических, так и в нестатических классах.