有關c# get set的問題

這是form

public partial class Form1 : Form

{

Farmer farmer;

public Form1()

{

InitializeComponent();

farmer = new Farmer(15, 30);

}

private void Form1_Load(object sender, EventArgs e)

{

}

private void nudNumberOfCows_ValueChanged(object sender, EventArgs e)

{

farmer.NumberOfCows = (int)nudNumberOfCows.Value;

}

private void btnCal_Click(object sender, EventArgs e)

{

Console.WriteLine("I need {0} bags of feed for {1} cows", farmer.BagsOfFeed, farmer.NumberOfCows);

}

}

這是farmer類別

class Farmer

{

public int BagsOfFeed { get; private set; }

private int feedMultiplier;

public int FeedMultiplier { get { return feedMultiplier; } }

private int numberOfCows;

public int NumberOfCows

{

get

{

return numberOfCows;

}

set

{

numberOfCows = value;

BagsOfFeed = numberOfCows * FeedMultiplier;

}

}

public Farmer(int numberOfCows, int feedMultiplier)

{

this.feedMultiplier = feedMultiplier;

NumberOfCows = numberOfCows;

}

}

想請問的是....get set我實在搞不懂用這個做什麼,不是說看不懂,但是越弄越雜...有人能詳細說明這用法嗎?

還有就是上面的例子FeedMultiplier為啥不也設成get set,直接set feedMultiplier=value;

然後new Farmer(){NumberOfCows=15, FeedMultiplier=30};

我試了一開始不按人數按button....顯示的BagsOfFeed為0.....要按人數才會加

NumberOfCows和FeedMultiplier不都是為了要存取private的欄位嗎?

為啥同樣方法不行呢?

一定要為了feedMultiplier建一個farmer的建構函數

因為自學,沒有人可以問....希望高手能解答

已更新項目:

大概知道意思,前提是FeedMultiplier已經被設成唯讀,但我想知道的是,如果我不設成唯讀,一樣給FeedMultiplier get set,就像上面我說的一樣,然後在new時給他一個值,在執行的時候我遇到一個bug,一開始啥都不按直接按button去計算,是顯示I need 0 bags of feed for 15 cows,如果按人數後再按button計算BagsOfFeed才會跑,為啥上列的方法就沒這問題,我說的就有這問題,我有設點去一列一列的看,發現如果set feedMultiplier=value; value的值是0

2 個已更新項目:

我不是明明就有給值嗎?{NumberOfCows=15, FeedMultiplier=30},這害我對value這東西又有些搞不太懂了....還是我用法錯誤了呢?

1 個解答

評分
  • 9 年前
    最佳解答

    其實不用想的那麼複雜

    get和set是為了存取private欄位的、這沒有錯

    FeedMultiplier不設定set是為了將它設定為唯讀的屬性

    (針對Form1或是其他類別而言)

    以這個列子而言FeedMultiplier就是飼料的乘數30不想被外部的程式改變

    而NumberOfCows因為同時有get和set

    所以牛的數量可以改變

    改變的同時因為有

    set

    {

    numberOfCows = value;

    BagsOfFeed = numberOfCows * FeedMultiplier;

    }

    所以飼料袋為因為牛的數量改變而改變

    這裡

    public int BagsOfFeed { get; private set; }

    set因為有private的修飾詞

    所以它雖然不是唯讀的

    但是也只能在Farmer內部存取

    2011-08-18 12:05:09 補充:

    問題應該是在

    private void nudNumberOfCows_ValueChanged(object sender, EventArgs e)

    這段程式

    在還沒點數字以前它的預設值是0

    所以把牛的數量歸零了

    所以應該在

    farmer = new Farmer(15, 30);

    之後加上類似

    nudNumberOfCows.Value = 30;

    2011-08-18 12:24:11 補充:

    抱歉應該是

    nudNumberOfCows.Value = 15;

還有問題?馬上發問,尋求解答。