C#如何使用属性

时间:2014-07-05 19:56:30

标签: c#

使用属性封装的简单程序.. Farmer有字段snumberofCowsfeedMultiplier, 并写入控制台BagsOfFeed= numberofCows* feedMultiplier

namespace numberOfCows
{
    class Farmer
    {
        private int bagsOfFeed;
        //public const int FeedMultiplier = 30;
        private int numberOfCows;
        private int feedMultiplier;
        //private int bagsOfFeed;
        public Farmer(int numberOfCows, int feedMultiplie)
        {
            feedMultiplier = feedMultiplie;
            //this.feedMultiplier = feedMultiplie;
            NumberOfCows = numberOfCows;
            //this.numberOfCows = numberOfCows;
        }
        public int FeedMultiplier { get { return feedMultiplier; } }
        public int NumberOfCows
        {
            get
            {
                return numberOfCows;
            }
            set
            {
                numberOfCows = value;
                //BagsOfFeed = numberOfCows * FeedMultiplier;
            }
        }
        //READ ONLY PROPERTY
        public int BagsOfFeed {
            get { return bagsOfFeed; }
            set { bagsOfFeed = NumberOfCows * FeedMultiplier; }
        }
    }
}

当电话farmer = new Farmer( 15,30 ); Console.WriteLine("I need {0} bags of feed for {1} cows",farmer.BagsOfFeed, farmer.NumberOfCows);返回0 BagsOfFeed时......所以我不知道我哪里出错了。[我认为属性用于检索要读取的值。 ..还是什么时候我应该使用私人套装..]

2 个答案:

答案 0 :(得分:4)

BagsOfFeed setter永远不会被调用(并且不应该被调用,因为它是根据其他属性的值计算的)。此属性应如下所示:

    //READ ONLY PROPERTY
    public int BagsOfFeed {
        get { return NumberOfCows * FeedMultiplier; }
    }

有了它,private int bagsOfFeed;可以删除,因为它是不必要的。

答案 1 :(得分:4)

永远不会调用set的{​​{1}}方法,因为您永远不会BagsOfFeed,因此永远不会进行计算。您应该在BagsOfFeed = something;方法中进行计算,然后删除该字段。您的课程还有其他不需要存在的字段。例如,使用get属性,您可以使用FeedMultiplier(这称为auto-property),而不是仅使用带有支持字段的private set;。它可以改写为:

get

这会在您的示例中显示正确的结果:

  

我需要450袋饲料喂养15头奶牛