2011/12/22

C#資料型態的轉型與運算子優先順序

今天我寫了一C#段程式碼,目地是要抓取DrowDownList1被挑選的順序,然後加一就是
資料庫內的定義。
String sql = "insert into tablename (field1, field2) values " +
DrowDownList1.SelectedIndex + 1 + ", 'abc'";
看似上面的code沒有問題,如果不把sql印出來看,我想很多人不知道問題所在。恍然
一看完全抓不出頭緒,
一開始我還以為是URL編碼問題,很顯然一直抓錯方向,浪費時間,一直到我把DB
Server內所有的資料Select出來之後
才發現怎麼會有field1的value是11的,這時我才恍然大悟,原來
DrowDownList1.SelectedIndex是int ,1也是int,
自然會以為它們會先相加,結果錯了,不知道甚麼規定,
DrowDownList1.SelectedIndex與1都被轉型成string,然後用字串的加,也就是字串合
併。
好難抓的BUG喔,如果是C或C++這種不提供加號作為字串合併的語言,就不會有這種問
題,方便性之外,也提供了犯錯的方便性。
怎麼解自然不用多說了,(DrowDownList1.SelectedIndex + 1)前後加上,讓他先算就
好了。
順道一提一個在C# C++ C都會犯上的錯誤習慣
並不是說這樣寫是錯的 是很容易犯錯 所以是壞習慣
Response.Write(i++);
Printf("debug i=%d", gdb(&i));
本來上面的程式碼只是拿來除錯用
但是卻在裡面進行的區域變數的變動或者呼叫其他函數,而且還是call by address
這樣萬一以後取消這些print或dump的程式碼時 往往容易忘記裡面又進行了區域變數的
變動或者呼叫其他函數
特別是當要dump的information很長時

沒有留言:

張貼留言