Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Язык C

Свойства в 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[])

Специальный вид свойства для доступа по индексу (см. отдельную статью).

Лучшие практики

Язык C

  1. Антимикробная сила серебра: как металл борется с бактериями, грибками и вирусами
  2. Арифметические свойства: ассоциативность, коммутативность и дистрибутивность
  3. Показательные правила: ключевые свойства для алгебраических манипуляций
  4. Молибден-гафний-углерод (MHC): Высокотемпературный сплав с частицами-усилителями
  5. AMPCO® 25: Высокопроизводительный сплав для штамповочных инструментов и матриц
  6. UGICHROM® 4462: Высокопроизводительное микротрещинистое хромирование для гидравлических и пневматических систем
  7. UGICHROM® 4362 – Премиальная нержавеющая сталь с микротрещинистым хромированием для гидравлических и пневматическ…
  8. Bainidur® 1300 — Низкорастрескающийся высокопрочный кованый сплав
  9. Bainidur® 7980 CN — Премиальная низколегированная сталь для цепной закалки и азоцементации
  10. UGICHROM® 4460: сверхпрочная хромированная нержавеющая сталь для гидравлики и пневматики