Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теоретический_курс.doc
Скачиваний:
36
Добавлен:
10.11.2019
Размер:
7.68 Mб
Скачать

6. Понятие «Статический класс»

Статический класс в основном такой же, что и нестатический класс, но имеется одно отличие: нельзя создавать экземпляры статического класса. Другими словами, нельзя использовать ключевое слово new для создания переменной типа класса. Поскольку нет переменной экземпляра, доступ к членам статического класса осуществляется с использованием самого имени класса. Например, если имеется статический класс, называемый UtilityClass, имеющий открытый метод, называемый MethodA, вызов метода выполняется, как показано в следующем примере:

UtilityClass.MethodA();

Статический класс может использоваться как обычный контейнер для наборов методов, работающих на входных параметрах, и не должен возвращать или устанавливать каких-либо внутренних полей экземпляра. Например, в библиотеке классов платформы .NET Framework статический класс System.Math содержит методы, выполняющие математические операции, без требования сохранять или извлекать данные, уникальные для конкретного экземпляра класса Math. Это значит, что члены класса применяются путём задания имени класса и имени метода, как показано в следующем примере консольного приложения:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

//using System.Math;

namespace LC_Console

{

class Program

{

static void Main(string[] args)

{

double dub = -3.14;

Console.WriteLine(Math.Abs(dub));

Console.WriteLine(Math.Floor(dub));

Console.WriteLine(Math.Round(Math.Abs(dub)));

/* Выведет:

* 3.14

* -4

* 3

*/

}

}

}

Как и в случае с типами всех классов сведения о типе для статического класса загружаются средой CLR .NET Framework, когда загружается программа, которая ссылается на класс. Программа не может точно указать, когда загружается класс. Но гарантируется загрузка этого класса, инициализация его полей и вызов статического конструктора перед первым обращением к классу в программе. Статический конструктор, как уже говорилось, вызывается только один раз, и статический класс остаётся в памяти на время существования домена приложения, в котором находится программа.

Следующий список предоставляет основные характеристики статического класса:

  • Содержит только статические члены.

  • Создавать его экземпляры нельзя.

  • Он закрыт.

  • Не может содержать конструкторов экземпляров.

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

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

Пример консольного приложения, использующего статический класс и статические члены:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace LC_Console

{

public static class TemperatureConverter

{

public static double CelsiusToFahrenheit(string temperatureCelsius)

{

// Преобразуем аргумент в тип double для подсчёта

double celsius = Double.Parse(temperatureCelsius);

// Из Цельсий в ФаренгейтыConvert Celsius to Fahrenheit.

double fahrenheit = (celsius * 9 / 5) + 32;

return fahrenheit;

}

public static double FahrenheitToCelsius(string temperatureFahrenheit)

{

double fahrenheit = Double.Parse(temperatureFahrenheit);

double celsius = (fahrenheit - 32) * 5 / 9;

return celsius;

}

}

class TestTemperatureConverter

{

static void Main()

{

Console.WriteLine("Пожалуйста, выберите направления конвертирования");

Console.WriteLine("1. Из Цельсий в Фаренгейты.");

Console.WriteLine("2. Из Фаренгейтов в Цельсии.");

Console.Write(":");

string selection = Console.ReadLine();

double F, C = 0;

switch (selection)

{

case "1":

Console.Write("Укажите температуру по Цельсию: ");

F = TemperatureConverter.CelsiusToFahrenheit(Console.ReadLine());

Console.WriteLine("Температура в градусах Фаренгейта: {0:F2}", F);

break;

case "2":

Console.Write("Укажите температура по Фаренгейту: ");

C = TemperatureConverter.FahrenheitToCelsius(Console.ReadLine());

Console.WriteLine("Температура в градусах Цельсия: {0:F2}", C);

break;

default:

Console.WriteLine("Пожалуйста, выберите направления конвертирования.");

break;

}

// Keep the console window open in debug mode.

Console.WriteLine("Для продолжения нажмите любую клавишу . . .");

Console.ReadKey();

}

}

}

/* Выведет если ввести цифру 2 во время выполнения:

* Пожалуйста, выберите направления конвертирования

* 1. Из Цельсий в Фаренгейты.

* 2. Из Фаренгейтов в Цельсии.

* :2

* Укажите температура по Фаренгейту: 20

* Температура в градусах Цельсия: -6.67

* Для продолжения нажмите любую клавишу . . .

*/