2010年8月24日 星期二

封裝

學習重點

  • 欄位的屬性
  • 類別建構子
  • ToString()方法
主程式碼

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Party_Planer
{
    public partial class Form1 : Form
    {
        DinnerParty dinnerparty;//宣告dinnerparty是一個DinnerParty的變數。
        public Form1()
        {
            InitializeComponent();
            dinnerparty = new DinnerParty(5, false, true);
            //設定dinnerparty是DinnerParty裡的一個物件,呼叫DinnerParty的建構子並給予初始值。
            DisplayDinnerPartyCost();
            
        }

        private void DisplayDinnerPartyCost()
        {
            decimal Cost = dinnerparty.CalculateCost(healthyBox.Checked);
            CostLabel.Text = Cost.ToString("c");
            //ToString()方法可以將任何的變數轉換成字串,
            //但假如你傳送"c"給ToString(),它會將值轉換成當地貨幣,在此轉換成台幣。
        }

        private void fancyBox_CheckedChanged(object sender, EventArgs e)
        {
            dinnerparty.CalculateCostOfDecorations(fancyBox.Checked);
            DisplayDinnerPartyCost();
        }

        private void healthyBox_CheckedChanged(object sender, EventArgs e)
        {
            dinnerparty.SetHealthyOption(healthyBox.Checked);
            DisplayDinnerPartyCost();
        }

        private void numericUpDown1_ValueChanged(object sender, EventArgs e)
        {
            dinnerparty.NumberOfPeople = (int)numericUpDown1.Value;
            //呼叫NumberOfPeople的set存取器。
            DisplayDinnerPartyCost();
        }
    }
}

副程式碼(DinnerParty類別)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Party_Planer
{
    public class DinnerParty
    {
        public const int CostOfFoodPerPerson = 25;

        private int numberOfPeopele = 5;
        
        //使用numberOfPeople的屬性。
        public int NumberOfPeople
        {
            get//當numberOfPeople欄位被讀取時所使用的方法。
            {
                return numberOfPeopele;
            }
            set//當numberOfPeople欄位被設定時所使用的方法。
            {
                numberOfPeopele = value;
                CalculateCostOfDecorations(fancyDecorations);
            }
        }
        private bool fancyDecorations;

        public decimal CostOfBeveragesPerPerson;
        public decimal CostOfDecorations = 0;

        //為DinnerParty類別增加建構子初始化私有欄位。
        public DinnerParty(int numberOfPeople, bool healthyOption, bool fancyDecorations)
        {
            NumberOfPeople = numberOfPeopele;//觸發NumberOfPeople屬性的set方法。
            this.fancyDecorations = fancyDecorations;
            //等號左邊的this.fancyDecorations指的是DinnerParty類別裡面的fancyDecoration欄位,
            //而等號右邊的fancyDecorations在這邊代表DinnerParty建構子裡面的參數。
            SetHealthyOption(healthyOption);
            CalculateCostOfDecorations(fancyDecorations);
        }

        public void SetHealthyOption(bool healthyOption)
        {
            if(healthyOption)
            {
                CostOfBeveragesPerPerson = 5.00M;
            }
            else
            {
                CostOfBeveragesPerPerson = 20.00M;
            }
        }

        public void CalculateCostOfDecorations(bool fancy)
        {
            fancyDecorations = fancy;
            if(fancy)
            {
                CostOfDecorations = (NumberOfPeople * 15.00M) + 50M;
                //呼叫NumberOfPeople的get存取器。
            }
            else
            {
                CostOfDecorations = (NumberOfPeople * 7.50M) + 30M;
                //呼叫NumberOfPeople的get存取器。
            }
        }

        public decimal CalculateCost(bool healthyOption)
        {
            decimal totalCost = CostOfDecorations + ((CostOfBeveragesPerPerson + CostOfFoodPerPerson) * NumberOfPeople);
            //呼叫NumberOfPeople的get存取器。

            if (healthyOption)
            {
                return totalCost * .95M;
            }
            else
            {
                return totalCost;
            }
        }
    }

    
}

Demo圖

一開始執行時的畫面


人數增為10人


勾選Healthy Option


取消Fancy decorations





2010年8月19日 星期四

物件的垃圾收集機制



當一個物件不再具有任何參考,物件就會被垃圾收集機制處理掉。

建立具有Elephant類別的程式,產生兩個Elephant實例,接著讓它們交換參考,不要讓任何Elephant實例被垃圾收集機制處理掉。

主程式

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Swap
{
    public partial class Form1 : Form
    {
        Elephant lucinda;
        Elephant lloyd;
        Elephant change;

        public Form1()
        {
            InitializeComponent();
          
            lucinda = new Elephant();   ←初始化
            lucinda.Name = "Lucinda";
            lucinda.EarSize = 33;

            lloyd = new Elephant();        ←初始化
            lloyd.Name = "Lloyd";
            lloyd.EarSize = 40;


        }

        private void button1_Click(object sender, EventArgs e)
        {
            lloyd.WhoAmI();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            lucinda.WhoAmI();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            change = lloyd;←兩個物件裡的參考要交換需要有第三個參考來幫忙,以避免其中一個物件因為裡面不再有參考而被當作垃圾收集處理掉。
            lloyd = lucinda;
            lucinda = change;
            MessageBox.Show("Objects swapped");
        }

    }
}

Elephant類別程式

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace Swap
{
    class Elephant
    {
        public int EarSize;
        public string Name;

        public void WhoAmI()
        {
            MessageBox.Show("My EarSize are " + EarSize + " inches tall.", Name + " say...");
        }
    }
}

Demo圖


主應用框架

按下第一個按鈕

按下第二個按鈕

按下第三個按鈕

再按下第一個按鈕

2010年8月18日 星期三

交易現金


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace MoneyChange
{
    public partial class Form1 : Form
    { 
        Guy joe;
        Guy bob;
        int bank = 100;

        public void UpdateForm()  透過此類別可以即時更新標籤。 
        {
            joesCash.Text = joe.Name + "has $" + joe.Cash;
            bobsCash.Text = bob.Name + "has $" + bob.Cash;
            bankCash.Text = "The bank has $" + bank;
        }

        public Form1()
        {
            InitializeComponent();
            
            bob = new Guy();
            bob.Name = "Bob";
            bob.Cash = 100;

            joe = new Guy();
            joe.Name = "Joe";
            joe.Cash = 50;

            UpdateForm();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            bank += bob.GiveCash(5);
            UpdateForm();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (bank >= 10)
            {
                bank -= joe.ReceiveCash(10);
                UpdateForm();
            }
            else
            {
                MessageBox.Show("銀行沒錢錢囉!");
            }
        }

        private void joeGivesToBob_Click(object sender, EventArgs e)
        {
            joe.Cash -= joe.GiveCash(10);
            bob.Cash += bob.ReceiveCash(10);
            UpdateForm();
        }

        private void bobGivesToJoe_Click(object sender, EventArgs e)
        {
            bob.Cash -= bob.GiveCash(5);
            joe.Cash += joe.ReceiveCash(5);
            UpdateForm();
        }

        
    }
}

物件Guy程式碼
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace MoneyChange
{
    
        public class Guy
        {
            public string Name;
            public int Cash;

            public int GiveCash(int amount)
            {
                if (amount <= Cash && amount > 0)
                {
                    Cash -= amount;
                    return amount;
                }
                else
                {
                    MessageBox.Show("我沒錢給你!!");
                    return 0;
                }
            }

            public int ReceiveCash(int amount)
            {
                if (amount > 0)
                {
                    Cash += amount;
                    return amount;
                }
                else
                {
                    MessageBox.Show("我沒收到錢!!");
                    return 0;
                }
            }
        }
    
}

編譯:


計算里程數

建立一個計算商務旅行津貼的計算機,讓使用者輸入汽車里程表的起始讀值與結束讀值。根據這兩個讀值,它會計算出使用者駕駛了多少英哩數,並根據公司每英哩補貼0.39美元的政策,計算出要補貼他多少錢。


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication3
{
    public partial class Form1 : Form
    {
        int startingMileage;
        int endingMileage;
        double milesTraveled;
        double reimburseRate = .39;
        double amountOwed;
        public Form1()
        {
            InitializeComponent();
        }

        private void numericUpDown1_ValueChanged(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            startingMileage = (int)numericUpDown1.Value;
            endingMileage = (int)numericUpDown2.Value;
            if (startingMileage <= endingMileage)
            {
                milesTraveled = endingMileage - startingMileage;
                amountOwed = milesTraveled * reimburseRate;
                label4.Text = "$" + amountOwed;
            }
            else
            {
                MessageBox.Show("The starting mileage must be less than the ending mileage" + " Cannot Calculate Mileage");
            }
        }

        private void numericUpDown2_ValueChanged(object sender, EventArgs e)
        {

        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button2_Click(object sender, EventArgs e)
        {
            MessageBox.Show(milesTraveled.ToString());
        }
    }
}

2010年8月2日 星期一

Flashy

今天跟著書本寫了一個很有趣的程式,它可以讓背景變的七彩閃爍,超炫的。

程式碼


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Flashy
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            while (Visible)
                //此處使用Visible而不使用true,不然就算關掉,程式也會一直執行。
            {

                for (int c = 0; c < 254 && Visible; c++)
                {
                    this.BackColor = Color.FromArgb(c, 255 - c, c);
                    Application.DoEvents();
                    //告訴作業系統執行程式以外的動作,以防程式佔取整個CPU。
                    System.Threading.Thread.Sleep(3);
                }
                for (int c = 254; c < 0 && Visible; c--)
                {
                    this.BackColor = Color.FromArgb(c, 255 - c, c);
                    Application.DoEvents();
                    System.Threading.Thread.Sleep(3);
                }
          
            }

        }
    }
}

C#小技巧

1.輸入mbox之後,再連續案兩次tab鍵,會自動產生messagebox.show("test");
2.區塊註解Ctrl + K + C, 區塊取消註解Ctrl + K + U