Файл: Классы. Основные понятия.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 10.01.2024

Просмотров: 16

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.


class DemoClass

{

// ...

int field = 0;

public int publicField = 0;

public static int publicStaticField = 0;

// ...

}

(Код в Main):

var d9 = new DemoClass();

// Доступ к private полям запрещен

// Console.WriteLine($"Get private field: {d9.field}"); // Compile ERROR

// Доступ к полю объекта

d9.publicField = 123;

Console.WriteLine($"Get public field: {d9.publicField}"); // Get public field: 123

// Доступ к статическому полю класса

DemoClass.publicStaticField = 456;

Console.WriteLine($"Get public static field: {DemoClass.publicStaticField}"); // Get public static field: 456

Работать с открытыми полями напрямую (поля, которые имеют модификатор public) является плохой практикой. Если необходимо читать и изменять значение какого-либо поля, то лучше это делать через getter’ы и setter’ы – специальные методы, которые выполняют эту работу.

Создадим для класса Building методы для доступа и модификации значения поля height:

class Building

{

float height;

public float GetHeight() => height;

public float SetHeight(float height) => this.height = height;

}

Для работы с этим классом воспользуемся следующим кодом:

var b1 = new Building();

b1.SetHeight(12);

Console.WriteLine($"Height of building: {b1.GetHeight()}");

Создание специальных методов для работы с полями – возможный вариант, но в C# принят подход работы через свойства. Им посвящен следующий раздел.

Свойства

Основная причина создания getter’ов и setter’ов – это внедрение дополнительной логики, которая может потребоваться перед тем как выдать значение поля или присвоить ему новое значение. Для упрощения процесса решения такой задачи язык C# предлагает альтернативу – Свойства. С точки зрения пользователя класса работа с свойствами похожа на работу с открытыми полями. Но внутри, “под капотом”, это организовано так, что мы можем добавлять логику при чтении и записи.

Добавим в класс Building следующую конструкцию:

public float Height

{

get => height;

set => height = value;

}

Она описывает свойство Height. У свойства есть два ключевых слова – это get, оно определяет блок кода, который выполнится при чтении значения свойства, и set – выполнится при присвоении значения свойству. Причем, при необходимости, объявить можно только одно из них, например, если у свойства будет только get, то ему нельзя будет присвоить значение.


Для демонстрации работы с этим свойством напишем следующий код:

var b2 = new Building();

b2.Height = 456;

Console.WriteLine($"Height of building: {b2.Height}"); // Height of building: 456

Если для поля не предполагается, в текущий момент, какой-то дополнительной логики обработки при работе с ним, и это поле должно быть открытым, то в любом случае, лучший  вариант – сделать свойство с пустыми get и set, так как в будущем ситуация может измениться. Добавим в наш класс Building ещё два свойства, которые пока не связаны с какими-то конкретными полями:

public float Width { get; set; }

public float Length { get; set; }

С ними можно работать также как и с Height.

Ключевое слово this

Ключевое слово this используется внутри класса для ссылки на текущий экземпляр класса. Чаще всего его приходится использовать в методах для доступа к полям класса. Например, если у класса Building, с которым мы работали в предыдущем разделе, есть поле height, метод SetHeight был создан нами для того, чтобы присваивать этому полю значение, аргумент этого метода – переменная с именем height:

float SetHeight(float height)

В теле данного метода мы должны как-то явно задать, что значение этого аргумента будет присвоено приватному полю height, записать height = height мы не можем, так как в этом случае нет четкого понимания, что чему будет присваиваться. В этом случае, для явного указания, что мы хотим присвоить значение полю класса, следует использовать ключевое слово this так, как мы это реализовали в методе SetHeight:

public float SetHeight(float height) => this.height = height;

Ключевое слово static

В предыдущих разделах мы уже сталкивались с понятием статического метода и поля. Ещё раз обговорим этот момент. Если метод, поле или свойство имеет модификатор static, то это означает что они принадлежат уровню класса, а не объекту. То есть для работы с соответствующими элементами не нужно создавать экземпляр класса, можно работать напрямую через имя класса. Если класс объявлен с ключевым словом static, то такой класс называют статическим, он обладает следующими особенностями:

  • у такого класса все методы должны быть статическими;

  • его нельзя наследовать (класс является запечатанным);

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

  • нельзя создавать экземпляры таких классов.


Примером статического класса может быть класс Math из стандартной библиотеки C#.