如何使用set访问器设置只读属性

时间:2013-12-29 16:05:37

标签: c# properties encapsulation

我创建了一个类,它具有一个名为BagsOfFeed的int变量的自动属性。我添加了一个自动属性来防止从类外部更改值。

我使用另一个仅在设置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; } } } }

这是类Code

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}}

这是错误

  

错误1属性或索引器'cow_calculator1.Farmer.BagsOfFeed'无法分配 - 它是只读的(“第38行”“第17列”牛计算器1)

1 个答案:

答案 0 :(得分:1)

您可以将setter的范围设置为私有,并删除返回值。

public int BagsOfFeed { get; private set; }

大致相当于

private int bagsOfFeed;

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

或者在第二种格式中,您可以直接设置私有后备存储。