Свойства в C#: полное руководство по аксессорам, автосвойствам и абстрактным свойствам
Что такое свойство
Свойство (Property) — именованный член класса/структуры/интерфейса, предоставляющий гибкий механизм чтения, записи или вычисления значения приватного поля. Свойства — расширение полей (fields) с аксессорами get и set.
Свойства не обозначают мест хранения напрямую — их аксессоры читают, пишут или вычисляют значения.
Синтаксис свойств
Полный синтаксис с backing field
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
Автосвойства (Auto-implemented properties, C# 3.0+)
Компилятор сам создаёт скрытое backing field:
public string Name { get; set; } // читаем/пишем
public int Age { get; private set; } // публичное чтение, приватная запись
public string Id { get; } = Guid.NewGuid().ToString(); // только чтение (init-only в C# 9+)
public string Code { get; init; } // init-only: можно задать только в инициализаторе объекта
Expression-bodied свойства (C# 6.0+)
public string FullName => $"{FirstName} {LastName}"; // только get
public int DoubleValue { get => _value * 2; set => _value = value; }
Пример: класс Student со свойствами
public class Student
{
private string _code = "N.A";
private string _name = "Unknown";
private int _age = 0;
public string Code
{
get => _code;
set => _code = value;
}
public string Name
{
get => _name;
set => _name = value ?? "Unknown"; // защита от null
}
public int Age
{
get => _age;
set => _age = value >= 0 ? value : throw new ArgumentOutOfRangeException(nameof(value));
}
public override string ToString() => $"Code={Code}, Name={Name}, Age={Age}";
}
// Использование
var s = new Student();
s.Code = "001";
s.Name = "Zara";
s.Age = 9;
Console.WriteLine(s); // Code=001, Name=Zara, Age=9
s.Age += 1;
Console.WriteLine(s); // Code=001, Name=Zara, Age=10
Абстрактные свойства
В абстрактном классе/интерфейсе можно объявить свойство без реализации — наследники обязаны реализовать:
public abstract class Person
{
public abstract string Name { get; set; }
public abstract int Age { get; set; }
}
public class Student : Person
{
private string _name;
private int _age;
public override string Name
{
get => _name;
set => _name = value;
}
public override int Age
{
get => _age;
set => _age = value;
}
}
Свойства в интерфейсах
public interface IEntity
{
int Id { get; set; }
DateTime CreatedAt { get; } // только чтение
}
// Реализация в классе
public class User : IEntity
{
public int Id { get; set; }
public DateTime CreatedAt { get; } = DateTime.UtcNow; // init-only
}
Свойства только для чтения: readonly vs init
| Вариант | Когда можно задать | C# версия |
|---|---|---|
get без set + backing field | В конструкторе или инициализаторе поля | 1.0 |
get; private set; | В классе (конструктор, методы) | 2.0 |
get; init; | Только в инициализаторе объекта new T { Prop = x } | 9.0 |
readonly struct + init | Гарантия неизменяемости | 9.0 |
Индексаторы (this[])
Специальный вид свойства для доступа по индексу (см. отдельную статью).
Лучшие практики
- Предпочитайте автосвойства — меньше кода, можно потом расширить
- Используйте
initдля неизменяемых объектов (DTO, записи) - Валидируйте в
set(диапазоны, null-check) - Не делайте тяжёлые вычисления в
get— кэшируйте или используйте метод - Избегайте побочных эффектов в
get(логирование, I/O, изменение состояния) - Для массивов/коллекций возвращайте копию или
IReadOnlyList<T>вместо прямого доступа к внутреннему списку - Именование: PascalCase, существительные или прилагательные (
IsValid,Count,Name)
Язык C
- Антимикробная сила серебра: как металл борется с бактериями, грибками и вирусами
- Арифметические свойства: ассоциативность, коммутативность и дистрибутивность
- Показательные правила: ключевые свойства для алгебраических манипуляций
- Молибден-гафний-углерод (MHC): Высокотемпературный сплав с частицами-усилителями
- AMPCO® 25: Высокопроизводительный сплав для штамповочных инструментов и матриц
- UGICHROM® 4462: Высокопроизводительное микротрещинистое хромирование для гидравлических и пневматических систем
- UGICHROM® 4362 – Премиальная нержавеющая сталь с микротрещинистым хромированием для гидравлических и пневматическ…
- Bainidur® 1300 — Низкорастрескающийся высокопрочный кованый сплав
- Bainidur® 7980 CN — Премиальная низколегированная сталь для цепной закалки и азоцементации
- UGICHROM® 4460: сверхпрочная хромированная нержавеющая сталь для гидравлики и пневматики