2008年1月12日 星期六

OOP Pass by Value OR Reference ?

最近新接到的案子採用C#語言開發WEB應用程式,
雖然曾經自修過該門語言,但是全無實戰經驗,
許久前就曾讀到OOP語言參數的傳遞都是Pass By Reference,
但開發的第一天就遇上OOP的Pass by Value OR Reference 的問題,
起先一直覺得這個問題很古怪,原來是本身的基礎不扎實,
dropdownlist 是.NET中的WEB控制項,也就是在WEB下顯示下拉式選單
首先拉了二個dropdownlist到Studio的設計頁面,
主要是要讓使用者輸入起始時(hour)及結束時(hour)
二者ID分別取為StartHour及EndHour
接在在Page_Load中加入如下的程式

//在下拉選單中加入00-23 的選項
for(int i = 0; i <= 23; i++)
{
ListItem item = new ListItem(i.ToString().PadLeft(2,'0'),i.ToString().PadLeft(2,'0'));
this.StartHour.Items.Add(item);
this.EndHour.Items.Add(item);
}

ok,程式運作無誤,下拉選單正確的出現24個選項(00 - 23)
接著,從資料庫中取值選擇對應的選項
假設 A = "01" b = "02"
StartHour.SelectedIndex = A;
EndHour.SelectedIndex = B;

回到WEB的除錯畫面
開始時和結束時二者的下拉選項都是 02
不對呀?StartHour 應是 01
為何會這樣,起先百思不得其解
接著將程式再修正
假設 A與B均轉換為Int32 A = 1 B = 2
StartHour.Items[A].Selected = true;
StartHour.Items[B].Selected = true;
運行結果更慘,編譯器報錯︰不可以在 DropDownList 中選取多個項目。
此時突然浮現傳值傳參考
會不會是在Page_Load時加入dropdownlist內的項目都指向同一個ListItem物件
才會造成選取項目均相同的錯誤結果
將Page_Load中的程式修正成

for(int i = 0; i <= 23; i++)
{
this.StartHour.Items.Add(new ListItem(i.ToString().PadLeft(2,'0'),i.ToString().PadLeft(2,'0')));
this.EndHour.Items.Add(new ListItem(i.ToString().PadLeft(2,'0'),i.ToString().PadLeft(2,'0')));
}

問題點果然是在 Pass by Value OR Reference
基礎很重要......XD

沒有留言: