Поле свойств - для чего это полезно?

С одной стороны, я знаю, что целесообразным использованием свойств является наличие поля поддержки, как в следующем примере:

    private int m_Capacity;

    public int Capacity
    {
        get { return m_Capacity > 0 ? m_Capacity : -666; }
        set { m_Capacity = value; }
    }

С другой стороны, какую пользу я получу от использования вышеприведенного примера для отказа от поля и использования только свойства для всех целей, например, в следующем примере:

    public int Capacity
    {
        get { return Capacity > 0 ? Capacity : -666; }
        set { Capacity = value; }
    }

Что хорошего в использовании поля резервного копирования для обычных (неавторизированных) свойств?

Ответ 1

Если вы это сделаете:

public int Capacity 
{ 
    get { return Capacity > 0 ? Capacity : -666; } 
    set { Capacity = value; } 
}

тогда ваш код будет иметь бесконечную рекурсию. Это никогда не сработает. Это потому, что геттер для Capacity ссылается на себя. То же самое касается установщика.

Если вы не используете автоматические свойства, вам нужно поле поддержки

Ответ 2

Явный частный член полезен, если вам когда-либо понадобится доступ к фактическому значению m_Capacity, а не к "управляемому" значению, которое вы получаете из свойства Capacity,

EDIT: другие сообщения правильно указывают на синтаксическую ошибку. Я тоже должен был упомянуть об этом, но я проигнорировал его и просто попытался ответить на его вопрос, который, казалось, касался автоматических свойств

Ответ 3

В основном, потому что вы получите StackOverflow.

Ответ 4

Не забывайте, что Properties - это просто сокращенный синтаксис для генерации методов getter и setter. Они выглядят как поля, но это не так.

Ответ 5

Поддерживаемые поля поддерживают концепцию инкапсуляции.

Инкапсуляция позволяет позже изменить детали реализации класса без изменения его интерфейса.

Это означает, что наличие поля поддержки с геттерами и сеттерами вместо того, чтобы иметь открытый член класса, сделает ваш код более надежным и/или читаемым для будущих разработчиков или вашего будущего.