【问题标题】:How to set a read only property with a set accessor如何使用 set 访问器设置只读属性
【发布时间】:2013-12-29 16:05:36
【问题描述】:

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

我只在设置了NumberOfCows 属性时才使用另一个属性来计算BagsOfFeed。 当我将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)

【问题讨论】:

    标签: c# properties encapsulation


    【解决方案1】:

    您可以将 setter 限定为私有,并删除返回值。

    public int BagsOfFeed { get; private set; }
    

    大致相当于

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

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

    【讨论】:

    • 并且最好摆脱返回自身的属性,返回自身......
    猜你喜欢
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2016-01-02
    相关资源
    最近更新 更多