ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 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#.