Опубликован: 25.03.2010 | Доступ: свободный | Студентов: 1447 / 158 | Оценка: 4.31 / 4.00 | Длительность: 25:42:00
Лекция 7:

Основы языка C#. Часть 1

< Лекция 6 || Лекция 7: 12345 || Лекция 8 >

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

В предыдущем примере мы использовали явную инициализацию общих (статических) данных. Но что делать, как быть, если статические данные нужно загружать из базы данных или файла. Для этого уже потребуются некоторые программные действия, т.е. метод. Желательно, чтобы он вызывался автоматически при создании класса. Есть такой метод, который называется статическим конструктором. Вот каким он должен удовлетворять требованиям:

  • Любой класс или структура может имет только один статический конструктор.
  • Статический конструктор выполняется только один раз, независимо от того, сколько создается объектов данного типа.
  • Статический конструктор не может иметь модификаторов доступа и параметров.
  • Среда выполнения вызывает статический конструктор, когда создается первый экземпляр класса или перед первым обращением к статическому члену.
  • Статический конструктор срабатывает до выполнения любого конструктора уровня экземпляра.

Модифицируем наш последний пример, применив для инициализации общих данных статический конструктор.

using System;
        
class Student // Модель одного студента
{
    // Члены уровня класса
    private static string institute; // Институт
    public static void ChangeInstitute(string ins)
    { institute = ins; }
    private static string faculty; // Факультет
    public static void ChangeFaculty(string fac)
    { faculty = fac; }
    
    // Статический конструктор для инициализации 
    // общих данных-членов уровня класса
    static Student()
    {
        institute = "КИЦМ";
        faculty = "Горный";
    }
    
    // Члены объектного уровня
    private string surName; // Фамилия
    private int age, rate;  // Возраст, курс
    
    // Конструктор
    public Student(string surName, int age, int rate)
    {
        this.surName = surName;
        this.age = age;
        this.rate = rate;
    }
    
    // Метод печати всей информации о студенте
    public void Show()
    {
        Console.WriteLine("Студент {0}: ", surName);
        Console.Write("Институт " + institute
                    + ", факультет " + faculty);
        Console.WriteLine(", возраст " + age 
                        + ", курс " + rate);
        Console.WriteLine();    // Создание пустой строки
    }
}
       
class Start
{
    static void Main()
    {
        // Создаем массив ссылок
        Student[] students = new Student[3];
    
        // Создаем несколько студентов
        students[0] = new Student("Иванов", 18, 1);
        students[1] = new Student("Петров", 19, 2);
        students[2] = new Student("Сидоров", 20, 3);
       
        // Выводим студентов до реорганизации
        Console.WriteLine("Студенты до реорганизации:");
        for (int i = 0; i < students.Length; i++)
            students[i].Show();
    
        // Меняем общее для всех студентов 
        // название института и факультета
        Student.ChangeInstitute("СФУ");
        Student.ChangeFaculty("ФФО");
    
        // Выводим студентов после реорганизации
        Console.WriteLine(Environment.NewLine + "Студенты 
          после реорганизации:");
        for (int i = 0; i < students.Length; i++)
            students[i].Show();
        
        Console.ReadLine();
    }
}
Листинг 7.12. Применение статического конструктора для инициализации общих данных

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

Статические классы

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

Приведем пример работы с едиными данными:

using System;
        
static class Clock // Модель часов
{
    // Все члены должны быть уровня класса
    public static void PrintTime()
    {
        Console.WriteLine(DateTime.Now.ToShortTimeString());
    }
    
    public static void PrintDate()
    {
        Console.WriteLine(DateTime.Today.ToShortDateString());
    }
}
       
class Start
{
    static void Main()
    {
         // Настройка консоли
        Console.Title = "Применение статического класса";
        Console.ForegroundColor = ConsoleColor.White;
        Console.CursorVisible = false;
    
       // Создавать экземпляр нельзя!!!
        // Clock clock = new Clock();
    
        Clock.PrintDate();
        Clock.PrintTime();
    
        Console.ReadLine();
    }
}
Листинг 7.13. Применение статического класса

Результат будет таким


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

< Лекция 6 || Лекция 7: 12345 || Лекция 8 >
Максим Филатов
Максим Филатов

Прошел курс. Получил код Dreamspark. Ввожу код на сайте, пишет:

Срок действия этого кода проверки уже истек. Проверьте, правильно ли введен код. У вас осталось две попытки. Вы также можете выбрать другой способ проверки или предоставить соответствующие документы, подтверждающие ваш академический статус.

 

Как активировать код?