Ключевое слово static
new
, и он может содержать только члены или поля данных, помеченные ключевым словом static
. В случае нарушения этого правила возникают ошибки на этапе компиляции.На заметку!
Вспомните, что класс (или структура), который открывает доступ только к статической функциональности, часто называется обслуживающим классом. При проектировании обслуживающего класса рекомендуется применять ключевое слово static к самому определению класса.На первый взгляд такое средство может показаться довольно странным, учитывая невозможность создания экземпляров класса. Тем не менее, в первую очередь класс, который содержит только статические члены и/или константные данные, не нуждается в выделении для него памяти. В целях иллюстрации определите новый класс по имени TimeUtilClass
using System;
namespace StaticDataAndMembers
{
// Статические классы могут содержать только статические члены!
static class TimeUtilClass
{
public static void PrintTime()
=> Console.WriteLine(DateTime.Now.ToShortTimeString());
public static void PrintDate()
=> Console.WriteLine(DateTime.Today.ToShortDateString());
}
}
Так как класс TimeUtilClass
static
, создавать его экземпляры с помощью ключевого слова new
нельзя. Взамен вся функциональность доступна на уровне класса. Чтобы протестировать данный класс, добавьте к операторам верхнего уровня следующий код:// Это работает нормально.
TimeUtilClass.PrintDate();
TimeUtilClass.PrintTime();
// Ошибка на этапе компиляции!
// Создавать экземпляры статического класса невозможно!
TimeUtilClass u = new TimeUtilClass ();
Console.ReadLine();
Импортирование статических членов с применением ключевого слова using языка C#
В версии C# 6 появилась поддержка импортирования статических членов с помощью ключевого слова using
WriteLine()
класса Console
, а также обращения к свойствам Now
и Today
класса DateTime
, должен быть предусмотрен оператор using
для пространства имен System
. Из-за того, что все члены упомянутых классов являются статическими, в файле кода можно указать следующие директивы using static
:// Импортировать статические члены классов Console и DateTime.
using static System.Console;
using static System.DateTime;
После такого "статического импортирования" в файле кода появляется возможность напрямую применять статические методы классов Console
DateTime
, не снабжая их префиксом в виде имени класса, в котором они определены. Например, модифицируем наш обслуживающий класс TimeUtilClass
, как показано ниже:static class TimeUtilClass
{
public static void PrintTime()
=> WriteLine(Now.ToShortTimeString());
public static void PrintDate()
=> WriteLine(Today.ToShortDateString());
}
В более реалистичном примере упрощения кода за счет импортирования статических членов мог бы участвовать класс С#, интенсивно использующий класс System.Math
using static
и затем напрямую обращаться членам класса Math
в своем файле кода.