Как установить свойство только для чтения с помощью метода доступа set

Я создал класс с автоматическим свойством для переменной типа BagsOfFeed. Я добавил автоматическое свойство, чтобы предотвратить изменение значения извне класса.

Я использую другое свойство, которое вычисляет BagsOfFeed, только когда установлено свойство NumberOfCows. Я столкнулся с проблемой, когда делаю BagsOfFeed только для чтения, это не позволяет свойству NumberOfCows присвоить значение BagsOfFeed.

вот код класса

namespace cow_calculator1
{
    class Farmer
    {
        public Farmer(int numberOfCows, int feedMultiplier)
        {
            this.feedMultiplier = feedMultiplier;
            NumberOfCows = numberOfCows;
        }

        public int BagsOfFeed { get { return BagsOfFeed; } }

        private int feedMultiplier;
        public int FeedMultiplier
        {
            get
            {
                return feedMultiplier;
            }
        }

        private int numberOfCows;
        public int NumberOfCows
        {
            get
            {
                return numberOfCows;
            }
            set
            {
                numberOfCows = value;
                BagsOfFeed = numberOfCows * FeedMultiplier;
            }
        }
    }
}

это код формы

namespace cow_calculator1
{
    public partial class Form1 : Form
    {
        Farmer farmer;
        public Form1()
        {
            InitializeComponent();
            farmer = new Farmer(15, 30);
        }

        private void calculate_Click(object sender, EventArgs e)
        {
            Console.WriteLine("I need {0} bags of feed for {1} cows", farmer.BagsOfFeed, farmer.NumberOfCows);
        }

        private void numericUpDown1_ValueChanged(object sender, EventArgs e)
        {
            farmer.NumberOfCows = (int) numericUpDown1.Value;
        }
    }
}

это ошибка

Ошибка 1 Свойство или индексатор cow_calculator1.Farmer.BagsOfFeed нельзя присвоить - он доступен только для чтения («Строка 38» «Столбец 17» калькулятор коров1)


person Dogtronic    schedule 29.12.2013    source источник


Ответы (1)


Вы можете сделать сеттер частным и удалить возвращаемое значение.

public int BagsOfFeed { get; private set; }

Что примерно эквивалентно

private int bagsOfFeed;

public int BagsOfFeed { 
    get { return bagsOfFeed; }
    private set { bagsOfFeed = value; }
}

Или во втором формате вы можете просто установить частное хранилище резервных копий напрямую.

person ZombieSheep    schedule 29.12.2013
comment
А также лучше избавиться от свойства, которое возвращает само себя, которое возвращает само, что ... - person Dirk; 29.12.2013