Автоматически реализуемые свойства
Объявляйте свойства с помощью краткого синтаксиса автоматических свойств.
«Автоматически реализуемые свойства» — бесплатный урок C# Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 4 уроков всего.
Что такое свойство
Свойство снаружи выглядит как поле, но поддерживается методами доступа (get и set). Свойства позволяют предоставлять данные, сохраняя контроль над их чтением и записью.
using System;
class Program
{
public string Name { get; set; }
static void Main()
{
var p = new Program();
p.Name = "Coddy";
Console.WriteLine(p.Name);
}
}Синтаксис автоматически реализуемых свойств
Автоматически реализуемое свойство использует конструкцию { get; set; }. Компилятор сам создаёт скрытое резервное поле, поэтому Вам не нужно писать его вручную.
using System;
class Person
{
public string FirstName { get; set; }
public int Age { get; set; }
}
class Program
{
static void Main()
{
var person = new Person { FirstName = "Ada", Age = 36 };
Console.WriteLine(person.FirstName + " is " + person.Age);
}
}Почему свойства лучше полей
Открытые свойства предоставляют стабильный программный интерфейс. Позже Вы сможете добавить проверку или изменить способ хранения данных, не нарушив работу вызывающего кода. Открытые поля этого не позволяют.
using System;
class Account
{
public decimal Balance { get; set; }
}
class Program
{
static void Main()
{
var a = new Account();
a.Balance = 100.50m;
Console.WriteLine("Balance: " + a.Balance);
}
}Автоматически реализуемые свойства только для чтения
Не указывайте set, чтобы сделать свойство доступным только для чтения. Ему можно присвоить значение только в конструкторе или через инициализатор, поэтому по умолчанию оно остаётся неизменяемым.
using System;
class Circle
{
public double Radius { get; }
public Circle(double radius)
{
Radius = radius;
}
}
class Program
{
static void Main()
{
var c = new Circle(5.0);
Console.WriteLine("Radius: " + c.Radius);
}
}Значения свойств по умолчанию
Автоматически реализуемому свойству можно задать начальное значение с помощью = value;. Это выполняется при создании объекта, до начала тела любого конструктора.
using System;
class Settings
{
public bool DarkMode { get; set; } = true;
public int Volume { get; set; } = 50;
}
class Program
{
static void Main()
{
var s = new Settings();
Console.WriteLine("DarkMode: " + s.DarkMode + ", Volume: " + s.Volume);
}
}Закрытые методы записи
private set позволяет классу изменять значение внутри себя, не давая внешнему коду его изменить. Это распространённый приём инкапсуляции.
using System;
class Counter
{
public int Count { get; private set; }
public void Increment()
{
Count++;
}
}
class Program
{
static void Main()
{
var counter = new Counter();
counter.Increment();
counter.Increment();
Console.WriteLine("Count: " + counter.Count);
}
}Методы записи только при инициализации
Метод доступа init (C# 9+) разрешает присваивание только во время инициализации объекта. После создания объекта значение блокируется.
using System;
class Product
{
public string Name { get; init; }
public decimal Price { get; init; }
}
class Program
{
static void Main()
{
var p = new Product { Name = "Book", Price = 12.99m };
Console.WriteLine(p.Name + ": " + p.Price);
}
}Свойства с разными уровнями доступа
К свойствам применяются обычные модификаторы доступа. Уровни можно сочетать: например, открытый метод чтения с закрытым методом записи или полностью внутреннее свойство.
using System;
class User
{
public string Id { get; private set; }
public User(string id)
{
Id = id;
}
}
class Program
{
static void Main()
{
var u = new User("u-001");
Console.WriteLine("User Id: " + u.Id);
}
}Автоматически реализуемые свойства, похожие на вычисляемые
Автоматически реализуемые свойства хранят данные, но не вычисляют их. Если Вам нужно вычисляемое значение, используйте полное свойство, которое будет рассмотрено позже. Пока считайте автоматически реализуемые свойства простым хранилищем.
using System;
class Rectangle
{
public double Width { get; set; }
public double Height { get; set; }
}
class Program
{
static void Main()
{
var r = new Rectangle { Width = 4, Height = 3 };
double area = r.Width * r.Height;
Console.WriteLine("Area: " + area);
}
}Изменение автоматически реализуемых свойств
Доступное для записи автоматически реализуемое свойство можно читать и переназначать сколько угодно раз, как обычную переменную.
using System;
class Player
{
public int Score { get; set; }
}
class Program
{
static void Main()
{
var player = new Player();
player.Score = 10;
player.Score += 5;
player.Score *= 2;
Console.WriteLine("Score: " + player.Score);
}
}Объединение всего изученного
Типичный класс модели в основном состоит из автоматически реализуемых свойств: одни доступны для записи, другие можно задать только при инициализации, а у третьих есть закрытые методы записи. Благодаря этому класс остаётся кратким и понятным.
using System;
class BankAccount
{
public string Owner { get; init; }
public decimal Balance { get; private set; }
public void Deposit(decimal amount)
{
Balance += amount;
}
}
class Program
{
static void Main()
{
var acct = new BankAccount { Owner = "Lin" };
acct.Deposit(250m);
Console.WriteLine(acct.Owner + ": " + acct.Balance);
}
}Быстрая проверка
Проверьте, насколько хорошо Вы поняли автоматически реализуемые свойства.
Итоги
Вы узнали, что автоматически реализуемые свойства используют { get; set; } и резервное поле, создаваемое компилятором. Варианты включают доступное только для чтения свойство { get; }, private set для контролируемого изменения и init для значений, задаваемых один раз. Это стандартный способ предоставлять данные класса.
using System;
class Demo
{
public string A { get; set; } = "settable";
public string B { get; } = "read-only";
public string C { get; init; } = "init-only";
}
class Program
{
static void Main()
{
var d = new Demo { C = "changed-at-init" };
Console.WriteLine(d.A + ", " + d.B + ", " + d.C);
}
}Часто задаваемые вопросы
Урок «Автоматически реализуемые свойства» бесплатный?
Да — полный текст урока «Автоматически реализуемые свойства» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 4 уроков всего.
Чему я научусь в уроке «Автоматически реализуемые свойства»?
Объявляйте свойства с помощью краткого синтаксиса автоматических свойств. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C# Academy?
Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Автоматически реализуемые свойства»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C# Academy?
Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Автоматически реализуемые свойства
- Полные свойства с резервными полями
- Члены с телом-выражением
- Индексаторы