пользователей: 30398
предметов: 12406
вопросов: 234839
Конспект-online
РЕГИСТРАЦИЯ ЭКСКУРСИЯ


Классы и объекты в С#. Вложенные классы. Статические и динамические компоненты их различия и использование.

Классы являются основным типом в языке C#. Класс представляет собой структуру данных, которая объединяет в себе значения (поля) и действия (методы и другие функции-члены). Класс предоставляет определение для динамически создаваемых экземпляров класса, которые также именуются объектами

Новые классы создаются с помощью объявлений классов. Объявление класса начинается с заголовка, в котором указаны атрибуты и модификаторы класса, имя класса, базовый класс (если есть) и интерфейсы, реализуемые этим классом. За заголовком между разделителями { и } следует тело класса, в котором последовательно объявляются все члены класса.

Вот простой пример объявления класса с именем Point:

public class Point

{

    public int x, y;

    public Point(int x, int y)

    {

        this.x = x;

        this.y = y;

    }

}

Экземпляры классов создаются с помощью оператора new, который выделяет память для нового экземпляра, вызывает конструктор для инициализации этого экземпляра и возвращает ссылку на экземпляр. Следующие инструкции создают два объекта Point и сохраняют ссылки на них в две переменные:

Point p1 = new Point(0, 0);

Point p2 = new Point(10, 20);

Занимаемая объектом память автоматически освобождается, когда объект становится недоступен. В C# нет ни необходимости, ни возможности освобождать память объектов явным образом.

Члены

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

Ниже перечислены виды членов, которые могут содержаться в классе.

  • Константы - Константные значения, связанные с классом.
  • Поля - Переменные класса.
  • Методы - Вычисления и действия, которые может выполнять класс.
  • Свойства - Действия, связанные с чтением и записью именованных свойств класса.
  • Индексаторы - Действия, реализующие индексирование экземпляров класса, чтобы обращаться к ним как к массиву.
  • События - Уведомления, которые могут быть созданы этим классом.
  • Операторы - Поддерживаемые классом операторы преобразования и выражения.
  • Конструкторы - Действия, необходимые для инициализации экземпляров класса или класса в целом.
  • Методы завершения - Действия, выполняемые перед окончательным удалением экземпляров класса.
  • Типы - Вложенные типы, объявленные в классе.

Вложенные классы определяются внутри области определения другого класса. Классы, определенные внутри контекста пространства имен или вне пространства имен, но не внутри контекста другого класса, называются не вложенными.

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

Например, контейнерный класс может содержать коллекцию объектов. Предположим, что требуется некоторое средство для выполнения итерации по всем содержащимся объектам, чтобы позволить внешним пользователям, выполняющим итерацию, поддерживать маркер, или некую разновидность курсора, который запоминает свое текущее место во время итерации.

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

Вложенные классы по нескольким причинам предоставляют отличное решение такой проблемы.

Вложенные классы имеют доступ ко всем членам, видимым содержащему их классу, даже если эти члены являются приватными.

Вложенные классы, объявленные как public, позволяют создавать экземпляры коду, внешнему по отношению к охватывающему классу. Нотация обращения к вложенному классу подобна уточнению пространств имен. В следующем примере демонстрируется создание экземпляра вложенного класса:

public class A {

public class В { }

}

public class EntryPoint { static void Main() {

А.В b = new A.B () ;}

}

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

C#Копировать

UtilityClass.MethodA(); 

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

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

Ниже приведены основные возможности статического класса.

  • Содержит только статические члены.
  • Создавать его экземпляры нельзя.
  • Является запечатанным.
  • Не может содержать конструкторы экземпляров.

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

 

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

 

C# не поддерживает статические локальные переменные (переменные, объявленные в области действия метода).

Для объявления статических методов класса используется ключевое слово static перед возвращаемым типом члена, как показано в следующем примере:

public class Automobile

{

    public static int NumberOfWheels = 4;

    public static int SizeOfGasTank

    {  get

        {            return 15;        }

    }

    public static void Drive() { }

    public static event EventType RunOutOfGas;

    // Other non-static fields and properties...

}

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

Automobile.Drive();

int i = Automobile.NumberOfWheels;

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

Вызов статического метода генерирует инструкцию вызова в промежуточном языке Microsoft (MSIL), в то время как вызов метода экземпляра генерирует инструкцию callvirt, которая также проверяет наличие ссылок на пустые объекты. Однако в большинстве случаев разница в производительности двух видов вызовов несущественна.


11.01.2019; 17:00
хиты: 759
рейтинг:0
для добавления комментариев необходимо авторизироваться.
  Copyright © 2013-2024. All Rights Reserved. помощь